tsp 1.7.7__py3-none-any.whl → 1.8.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tsp/__init__.py +11 -11
- tsp/__meta__.py +1 -1
- tsp/concatenation.py +153 -0
- tsp/core.py +1162 -1035
- tsp/data/2023-01-06_755-test-Dataset_2031-Constant_Over_Interval-Hourly-Ground_Temperature-Thermistor_Automated.timeserie.csv +4 -4
- tsp/data/2023-01-06_755-test.metadata.txt +208 -208
- tsp/data/NTGS_example_csv.csv +6 -6
- tsp/data/NTGS_example_slash_dates.csv +6 -6
- tsp/data/example_geotop.csv +5240 -5240
- tsp/data/example_gtnp.csv +1298 -1298
- tsp/data/example_permos.csv +7 -7
- tsp/data/test_geotop_has_space.txt +5 -5
- tsp/dataloggers/AbstractReader.py +43 -43
- tsp/dataloggers/FG2.py +110 -110
- tsp/dataloggers/GP5W.py +114 -114
- tsp/dataloggers/Geoprecision.py +34 -34
- tsp/dataloggers/HOBO.py +914 -914
- tsp/dataloggers/RBRXL800.py +190 -190
- tsp/dataloggers/RBRXR420.py +308 -308
- tsp/dataloggers/__init__.py +15 -15
- tsp/dataloggers/logr.py +115 -115
- tsp/dataloggers/test_files/004448.DAT +2543 -2543
- tsp/dataloggers/test_files/004531.DAT +17106 -17106
- tsp/dataloggers/test_files/004531.HEX +3587 -3587
- tsp/dataloggers/test_files/004534.HEX +3587 -3587
- tsp/dataloggers/test_files/010252.dat +1731 -1731
- tsp/dataloggers/test_files/010252.hex +1739 -1739
- tsp/dataloggers/test_files/010274.hex +1291 -1291
- tsp/dataloggers/test_files/010278.hex +3544 -3544
- tsp/dataloggers/test_files/012064.dat +1286 -1286
- tsp/dataloggers/test_files/012064.hex +1294 -1294
- tsp/dataloggers/test_files/012081.hex +3532 -3532
- tsp/dataloggers/test_files/07B1592.DAT +1483 -1483
- tsp/dataloggers/test_files/07B1592.HEX +1806 -1806
- tsp/dataloggers/test_files/07B4450.DAT +2234 -2234
- tsp/dataloggers/test_files/07B4450.HEX +2559 -2559
- tsp/dataloggers/test_files/FG2_399.csv +9881 -9881
- tsp/dataloggers/test_files/GP5W.csv +1121 -1121
- tsp/dataloggers/test_files/GP5W_260.csv +1884 -1884
- tsp/dataloggers/test_files/GP5W_270.csv +2210 -2210
- tsp/dataloggers/test_files/H08-030-08_HOBOware.csv +998 -998
- tsp/dataloggers/test_files/RBR_01.dat +1046 -1046
- tsp/dataloggers/test_files/RBR_02.dat +2426 -2426
- tsp/dataloggers/test_files/RSTDT2055.csv +2152 -2152
- tsp/dataloggers/test_files/U23-001_HOBOware.csv +1001 -1001
- tsp/dataloggers/test_files/hobo-negative-2.txt +6396 -6396
- tsp/dataloggers/test_files/hobo-negative-3.txt +5593 -5593
- tsp/dataloggers/test_files/hobo-positive-number-1.txt +1000 -1000
- tsp/dataloggers/test_files/hobo-positive-number-2.csv +1003 -1003
- tsp/dataloggers/test_files/hobo-positive-number-3.csv +1133 -1133
- tsp/dataloggers/test_files/hobo-positive-number-4.csv +1209 -1209
- tsp/dataloggers/test_files/hobo2.csv +8702 -8702
- tsp/dataloggers/test_files/hobo_1_AB.csv +21732 -21732
- tsp/dataloggers/test_files/hobo_1_AB_Details.txt +133 -133
- tsp/dataloggers/test_files/hobo_1_AB_classic.csv +4373 -4373
- tsp/dataloggers/test_files/hobo_1_AB_defaults.csv +21732 -21732
- tsp/dataloggers/test_files/hobo_1_AB_minimal.txt +1358 -1358
- tsp/dataloggers/test_files/hobo_1_AB_var2.csv +3189 -3189
- tsp/dataloggers/test_files/hobo_1_AB_var3.csv +2458 -2458
- tsp/dataloggers/test_files/logR_ULogC16-32_1.csv +106 -106
- tsp/dataloggers/test_files/logR_ULogC16-32_2.csv +100 -100
- tsp/dataloggers/test_files/mon_3_Ta_2010-08-18_2013-02-08.txt +21724 -21724
- tsp/dataloggers/test_files/rbr_001.dat +1133 -1133
- tsp/dataloggers/test_files/rbr_001.hex +1139 -1139
- tsp/dataloggers/test_files/rbr_001_no_comment.dat +1132 -1132
- tsp/dataloggers/test_files/rbr_001_no_comment.hex +1138 -1138
- tsp/dataloggers/test_files/rbr_002.dat +1179 -1179
- tsp/dataloggers/test_files/rbr_002.hex +1185 -1185
- tsp/dataloggers/test_files/rbr_003.hex +1292 -1292
- tsp/dataloggers/test_files/rbr_003.xls +0 -0
- tsp/dataloggers/test_files/rbr_xl_001.DAT +1105 -1105
- tsp/dataloggers/test_files/rbr_xl_002.DAT +1126 -1126
- tsp/dataloggers/test_files/rbr_xl_003.DAT +4622 -4622
- tsp/dataloggers/test_files/rbr_xl_003.HEX +3587 -3587
- tsp/gtnp.py +148 -148
- tsp/labels.py +3 -3
- tsp/misc.py +90 -90
- tsp/physics.py +101 -101
- tsp/plots/static.py +373 -373
- tsp/readers.py +548 -548
- tsp/time.py +45 -45
- tsp/tspwarnings.py +14 -14
- tsp/utils.py +101 -101
- tsp/version.py +1 -1
- {tsp-1.7.7.dist-info → tsp-1.8.1.dist-info}/METADATA +30 -23
- tsp-1.8.1.dist-info/RECORD +94 -0
- {tsp-1.7.7.dist-info → tsp-1.8.1.dist-info}/WHEEL +5 -5
- {tsp-1.7.7.dist-info → tsp-1.8.1.dist-info/licenses}/LICENSE +674 -674
- tsp/dataloggers/test_files/CSc_CR1000_1.dat +0 -295
- tsp/scratch.py +0 -6
- tsp-1.7.7.dist-info/RECORD +0 -95
- {tsp-1.7.7.dist-info → tsp-1.8.1.dist-info}/top_level.txt +0 -0
tsp/time.py
CHANGED
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
import re
|
|
2
|
-
from datetime import datetime, tzinfo
|
|
3
|
-
|
|
4
|
-
from typing import Union
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
def get_utc_offset(offset: "Union[str,int]") -> int:
|
|
8
|
-
"""Get the UTC offset in seconds from a string or integer"""
|
|
9
|
-
|
|
10
|
-
if isinstance(offset, str):
|
|
11
|
-
if offset.lower() == "utc" or (offset.lower() == "z"):
|
|
12
|
-
return 0
|
|
13
|
-
|
|
14
|
-
pattern = re.compile(r"([+-]?)(\d{2}):(\d{2})")
|
|
15
|
-
match = pattern.match(offset)
|
|
16
|
-
|
|
17
|
-
if not match:
|
|
18
|
-
raise ValueError("Offset must be a string in the format '+HH:MM' or '-HH:MM'")
|
|
19
|
-
|
|
20
|
-
sign = match.group(1)
|
|
21
|
-
hours = int(match.group(2))
|
|
22
|
-
minutes = int(match.group(3))
|
|
23
|
-
utc_offset = (hours*60 + minutes)*60
|
|
24
|
-
if sign == "-":
|
|
25
|
-
utc_offset *= -1
|
|
26
|
-
|
|
27
|
-
elif isinstance(offset, int):
|
|
28
|
-
utc_offset = offset
|
|
29
|
-
|
|
30
|
-
else:
|
|
31
|
-
raise ValueError("Offset must be a string in the format '+HH:MM' or '-HH:MM' or an integer in seconds")
|
|
32
|
-
|
|
33
|
-
return utc_offset
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def format_utc_offset(offset: tzinfo) -> str:
|
|
37
|
-
"""Format a UTC offset as a string in the format '+HH:MM' or '-HH:MM'"""
|
|
38
|
-
utc_offset = offset.utcoffset(datetime.now()).total_seconds()
|
|
39
|
-
sign = "-" if utc_offset < 0 else "+"
|
|
40
|
-
hours = int(abs(utc_offset)//3600)
|
|
41
|
-
minutes = int(abs(utc_offset)%3600/60)
|
|
42
|
-
|
|
43
|
-
if hours == 0 and minutes == 0:
|
|
44
|
-
return "UTC"
|
|
45
|
-
|
|
1
|
+
import re
|
|
2
|
+
from datetime import datetime, tzinfo
|
|
3
|
+
|
|
4
|
+
from typing import Union
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def get_utc_offset(offset: "Union[str,int]") -> int:
|
|
8
|
+
"""Get the UTC offset in seconds from a string or integer"""
|
|
9
|
+
|
|
10
|
+
if isinstance(offset, str):
|
|
11
|
+
if offset.lower() == "utc" or (offset.lower() == "z"):
|
|
12
|
+
return 0
|
|
13
|
+
|
|
14
|
+
pattern = re.compile(r"([+-]?)(\d{2}):(\d{2})")
|
|
15
|
+
match = pattern.match(offset)
|
|
16
|
+
|
|
17
|
+
if not match:
|
|
18
|
+
raise ValueError("Offset must be a string in the format '+HH:MM' or '-HH:MM'")
|
|
19
|
+
|
|
20
|
+
sign = match.group(1)
|
|
21
|
+
hours = int(match.group(2))
|
|
22
|
+
minutes = int(match.group(3))
|
|
23
|
+
utc_offset = (hours*60 + minutes)*60
|
|
24
|
+
if sign == "-":
|
|
25
|
+
utc_offset *= -1
|
|
26
|
+
|
|
27
|
+
elif isinstance(offset, int):
|
|
28
|
+
utc_offset = offset
|
|
29
|
+
|
|
30
|
+
else:
|
|
31
|
+
raise ValueError("Offset must be a string in the format '+HH:MM' or '-HH:MM' or an integer in seconds")
|
|
32
|
+
|
|
33
|
+
return utc_offset
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def format_utc_offset(offset: tzinfo) -> str:
|
|
37
|
+
"""Format a UTC offset as a string in the format '+HH:MM' or '-HH:MM'"""
|
|
38
|
+
utc_offset = offset.utcoffset(datetime.now()).total_seconds()
|
|
39
|
+
sign = "-" if utc_offset < 0 else "+"
|
|
40
|
+
hours = int(abs(utc_offset)//3600)
|
|
41
|
+
minutes = int(abs(utc_offset)%3600/60)
|
|
42
|
+
|
|
43
|
+
if hours == 0 and minutes == 0:
|
|
44
|
+
return "UTC"
|
|
45
|
+
|
|
46
46
|
return f"{sign}{hours:02d}:{minutes:02d}"
|
tsp/tspwarnings.py
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import numpy as np
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class DuplicateTimesWarning(UserWarning):
|
|
5
|
-
"""For when duplicate times are found in a file."""
|
|
6
|
-
def __init__(self, times):
|
|
7
|
-
self.times = times
|
|
8
|
-
|
|
9
|
-
def _msg(self, times) -> str:
|
|
10
|
-
m = f"Duplicate timestamps found: {times[np.where(times.duplicated())[0]]}. That's bad."
|
|
11
|
-
return m
|
|
12
|
-
|
|
13
|
-
def __str__(self):
|
|
14
|
-
return self._msg(self.times)
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class DuplicateTimesWarning(UserWarning):
|
|
5
|
+
"""For when duplicate times are found in a file."""
|
|
6
|
+
def __init__(self, times):
|
|
7
|
+
self.times = times
|
|
8
|
+
|
|
9
|
+
def _msg(self, times) -> str:
|
|
10
|
+
m = f"Duplicate timestamps found: {times[np.where(times.duplicated())[0]]}. That's bad."
|
|
11
|
+
return m
|
|
12
|
+
|
|
13
|
+
def __str__(self):
|
|
14
|
+
return self._msg(self.times)
|
|
15
15
|
|
tsp/utils.py
CHANGED
|
@@ -1,101 +1,101 @@
|
|
|
1
|
-
import pandas as pd
|
|
2
|
-
import numpy as np
|
|
3
|
-
|
|
4
|
-
import tsp
|
|
5
|
-
from tsp import TSP
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def resolve_duplicate_times(t: TSP, keep="first") -> TSP:
|
|
9
|
-
"""Eliminate duplicate times in a TSP.
|
|
10
|
-
|
|
11
|
-
Parameters
|
|
12
|
-
----------
|
|
13
|
-
tsp : TSP
|
|
14
|
-
TSP to resolve duplicate times in.
|
|
15
|
-
keep : str, optional
|
|
16
|
-
Method to resolve duplicate times. Chosen from "first", "average", "last", "strip"
|
|
17
|
-
by default "first"
|
|
18
|
-
|
|
19
|
-
Returns
|
|
20
|
-
-------
|
|
21
|
-
TSP
|
|
22
|
-
TSP with no duplicated times."""
|
|
23
|
-
resolver = _get_duplicate_resolver(keep)
|
|
24
|
-
return resolver(t)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def _get_duplicate_resolver(keep: str):
|
|
28
|
-
if keep == "first":
|
|
29
|
-
return _first_duplicate_time
|
|
30
|
-
elif keep == "average":
|
|
31
|
-
return _average_duplicate_time
|
|
32
|
-
elif keep == "last":
|
|
33
|
-
return _last_duplicate_time
|
|
34
|
-
elif keep == "strip":
|
|
35
|
-
return _strip_duplicate_time
|
|
36
|
-
else:
|
|
37
|
-
raise ValueError(f"Unknown duplicate resolver method: {keep}")
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
def _first_duplicate_time(t: TSP):
|
|
41
|
-
df = t.wide
|
|
42
|
-
df = df[~df.index.duplicated(keep="first")]
|
|
43
|
-
|
|
44
|
-
time = df.index
|
|
45
|
-
values = df.drop(['time'], axis=1).values
|
|
46
|
-
depths = df.drop(['time'], axis=1).columns
|
|
47
|
-
|
|
48
|
-
t_new = TSP(times=time, values=values, depths=depths,
|
|
49
|
-
latitude=t.latitude, longitude=t.longitude,
|
|
50
|
-
site_id=t.site_id, metadata=t.metadata)
|
|
51
|
-
|
|
52
|
-
return t_new
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
def _last_duplicate_time(t: TSP):
|
|
56
|
-
df = t.wide
|
|
57
|
-
df = df[~df.index.duplicated(keep="last")]
|
|
58
|
-
|
|
59
|
-
time = df.index
|
|
60
|
-
values = df.drop(['time'], axis=1).values
|
|
61
|
-
depths = df.drop(['time'], axis=1).columns
|
|
62
|
-
|
|
63
|
-
t_new = TSP(times=time, values=values, depths=depths,
|
|
64
|
-
latitude=t.latitude, longitude=t.longitude,
|
|
65
|
-
site_id=t.site_id, metadata=t.metadata)
|
|
66
|
-
|
|
67
|
-
return t_new
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def _strip_duplicate_time(t: TSP):
|
|
71
|
-
df = t.wide
|
|
72
|
-
df = df[~df.index.duplicated(keep=False)]
|
|
73
|
-
|
|
74
|
-
time = df.index
|
|
75
|
-
values = df.drop(['time'], axis=1).values
|
|
76
|
-
depths = df.drop(['time'], axis=1).columns
|
|
77
|
-
|
|
78
|
-
t_new = TSP(times=time, values=values, depths=depths,
|
|
79
|
-
latitude=t.latitude, longitude=t.longitude,
|
|
80
|
-
site_id=t.site_id, metadata=t.metadata)
|
|
81
|
-
|
|
82
|
-
return t_new
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
def _average_duplicate_time(t: TSP):
|
|
86
|
-
singleton = t.wide[~t.wide.index.duplicated(keep=False)]
|
|
87
|
-
duplicated = t.wide[t.wide.index.duplicated(keep=False)].drop(['time'], axis=1).reset_index()
|
|
88
|
-
averaged = duplicated.groupby(duplicated['index']).apply(lambda x: x[~x.isna()].mean(numeric_only=True))
|
|
89
|
-
averaged.insert(0, 'time',averaged.index)
|
|
90
|
-
|
|
91
|
-
df = pd.concat([singleton, averaged], ignore_index=False).sort_index()
|
|
92
|
-
|
|
93
|
-
time = df.index
|
|
94
|
-
values = df.drop(['time'], axis=1).values
|
|
95
|
-
depths = df.drop(['time'], axis=1).columns
|
|
96
|
-
|
|
97
|
-
t_new = TSP(times=time, values=values, depths=depths,
|
|
98
|
-
latitude=t.latitude, longitude=t.longitude,
|
|
99
|
-
site_id=t.site_id, metadata=t.metadata)
|
|
100
|
-
|
|
101
|
-
return t_new
|
|
1
|
+
import pandas as pd
|
|
2
|
+
import numpy as np
|
|
3
|
+
|
|
4
|
+
import tsp
|
|
5
|
+
from tsp import TSP
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def resolve_duplicate_times(t: TSP, keep="first") -> TSP:
|
|
9
|
+
"""Eliminate duplicate times in a TSP.
|
|
10
|
+
|
|
11
|
+
Parameters
|
|
12
|
+
----------
|
|
13
|
+
tsp : TSP
|
|
14
|
+
TSP to resolve duplicate times in.
|
|
15
|
+
keep : str, optional
|
|
16
|
+
Method to resolve duplicate times. Chosen from "first", "average", "last", "strip"
|
|
17
|
+
by default "first"
|
|
18
|
+
|
|
19
|
+
Returns
|
|
20
|
+
-------
|
|
21
|
+
TSP
|
|
22
|
+
TSP with no duplicated times."""
|
|
23
|
+
resolver = _get_duplicate_resolver(keep)
|
|
24
|
+
return resolver(t)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _get_duplicate_resolver(keep: str):
|
|
28
|
+
if keep == "first":
|
|
29
|
+
return _first_duplicate_time
|
|
30
|
+
elif keep == "average":
|
|
31
|
+
return _average_duplicate_time
|
|
32
|
+
elif keep == "last":
|
|
33
|
+
return _last_duplicate_time
|
|
34
|
+
elif keep == "strip":
|
|
35
|
+
return _strip_duplicate_time
|
|
36
|
+
else:
|
|
37
|
+
raise ValueError(f"Unknown duplicate resolver method: {keep}")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _first_duplicate_time(t: TSP):
|
|
41
|
+
df = t.wide
|
|
42
|
+
df = df[~df.index.duplicated(keep="first")]
|
|
43
|
+
|
|
44
|
+
time = df.index
|
|
45
|
+
values = df.drop(['time'], axis=1).values
|
|
46
|
+
depths = df.drop(['time'], axis=1).columns
|
|
47
|
+
|
|
48
|
+
t_new = TSP(times=time, values=values, depths=depths,
|
|
49
|
+
latitude=t.latitude, longitude=t.longitude,
|
|
50
|
+
site_id=t.site_id, metadata=t.metadata)
|
|
51
|
+
|
|
52
|
+
return t_new
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _last_duplicate_time(t: TSP):
|
|
56
|
+
df = t.wide
|
|
57
|
+
df = df[~df.index.duplicated(keep="last")]
|
|
58
|
+
|
|
59
|
+
time = df.index
|
|
60
|
+
values = df.drop(['time'], axis=1).values
|
|
61
|
+
depths = df.drop(['time'], axis=1).columns
|
|
62
|
+
|
|
63
|
+
t_new = TSP(times=time, values=values, depths=depths,
|
|
64
|
+
latitude=t.latitude, longitude=t.longitude,
|
|
65
|
+
site_id=t.site_id, metadata=t.metadata)
|
|
66
|
+
|
|
67
|
+
return t_new
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _strip_duplicate_time(t: TSP):
|
|
71
|
+
df = t.wide
|
|
72
|
+
df = df[~df.index.duplicated(keep=False)]
|
|
73
|
+
|
|
74
|
+
time = df.index
|
|
75
|
+
values = df.drop(['time'], axis=1).values
|
|
76
|
+
depths = df.drop(['time'], axis=1).columns
|
|
77
|
+
|
|
78
|
+
t_new = TSP(times=time, values=values, depths=depths,
|
|
79
|
+
latitude=t.latitude, longitude=t.longitude,
|
|
80
|
+
site_id=t.site_id, metadata=t.metadata)
|
|
81
|
+
|
|
82
|
+
return t_new
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _average_duplicate_time(t: TSP):
|
|
86
|
+
singleton = t.wide[~t.wide.index.duplicated(keep=False)]
|
|
87
|
+
duplicated = t.wide[t.wide.index.duplicated(keep=False)].drop(['time'], axis=1).reset_index()
|
|
88
|
+
averaged = duplicated.groupby(duplicated['index']).apply(lambda x: x[~x.isna()].mean(numeric_only=True))
|
|
89
|
+
averaged.insert(0, 'time',averaged.index)
|
|
90
|
+
|
|
91
|
+
df = pd.concat([singleton, averaged], ignore_index=False).sort_index()
|
|
92
|
+
|
|
93
|
+
time = df.index
|
|
94
|
+
values = df.drop(['time'], axis=1).values
|
|
95
|
+
depths = df.drop(['time'], axis=1).columns
|
|
96
|
+
|
|
97
|
+
t_new = TSP(times=time, values=values, depths=depths,
|
|
98
|
+
latitude=t.latitude, longitude=t.longitude,
|
|
99
|
+
site_id=t.site_id, metadata=t.metadata)
|
|
100
|
+
|
|
101
|
+
return t_new
|
tsp/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
version="1.
|
|
1
|
+
version="1.8.1"
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: tsp
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.8.1
|
|
4
4
|
Summary: Making permafrost data effortless
|
|
5
5
|
Home-page: https://gitlab.com/permafrostnet/teaspoon
|
|
6
6
|
Author: Nick Brown
|
|
7
7
|
Author-email: nick.brown@carleton.ca
|
|
8
|
-
License: UNKNOWN
|
|
9
|
-
Platform: UNKNOWN
|
|
10
8
|
Classifier: Development Status :: 4 - Beta
|
|
11
9
|
Classifier: Intended Audience :: Developers
|
|
12
10
|
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
|
|
@@ -14,31 +12,42 @@ Classifier: Operating System :: POSIX
|
|
|
14
12
|
Classifier: Programming Language :: Python
|
|
15
13
|
Classifier: Topic :: Software Development :: Libraries
|
|
16
14
|
Description-Content-Type: text/markdown
|
|
15
|
+
License-File: LICENSE
|
|
17
16
|
Requires-Dist: pandas
|
|
18
17
|
Requires-Dist: numpy
|
|
19
18
|
Requires-Dist: regex
|
|
20
19
|
Requires-Dist: matplotlib
|
|
21
20
|
Requires-Dist: setuptools
|
|
22
|
-
Provides-Extra: dev
|
|
23
|
-
Requires-Dist: manuel ; extra == 'dev'
|
|
24
|
-
Requires-Dist: pytest ; extra == 'dev'
|
|
25
|
-
Requires-Dist: pytest-cov ; extra == 'dev'
|
|
26
|
-
Requires-Dist: coverage ; extra == 'dev'
|
|
27
|
-
Requires-Dist: mock ; extra == 'dev'
|
|
28
|
-
Provides-Extra: full
|
|
29
|
-
Requires-Dist: scipy ; extra == 'full'
|
|
30
|
-
Requires-Dist: pfit (==0.2.1) ; extra == 'full'
|
|
31
|
-
Requires-Dist: openpyxl ; extra == 'full'
|
|
32
|
-
Requires-Dist: pyrsktools ; extra == 'full'
|
|
33
|
-
Requires-Dist: netCDF4 ; extra == 'full'
|
|
34
21
|
Provides-Extra: nc
|
|
35
|
-
Requires-Dist: netCDF4
|
|
36
|
-
Requires-Dist: pfit
|
|
22
|
+
Requires-Dist: netCDF4; extra == "nc"
|
|
23
|
+
Requires-Dist: pfit==0.2.1; extra == "nc"
|
|
37
24
|
Provides-Extra: plotting
|
|
38
|
-
Requires-Dist: scipy
|
|
25
|
+
Requires-Dist: scipy; extra == "plotting"
|
|
39
26
|
Provides-Extra: rbr
|
|
40
|
-
Requires-Dist: pyrsktools
|
|
41
|
-
Requires-Dist: openpyxl
|
|
27
|
+
Requires-Dist: pyrsktools; extra == "rbr"
|
|
28
|
+
Requires-Dist: openpyxl; extra == "rbr"
|
|
29
|
+
Provides-Extra: full
|
|
30
|
+
Requires-Dist: scipy; extra == "full"
|
|
31
|
+
Requires-Dist: pfit==0.2.1; extra == "full"
|
|
32
|
+
Requires-Dist: netCDF4; extra == "full"
|
|
33
|
+
Requires-Dist: pyrsktools; extra == "full"
|
|
34
|
+
Requires-Dist: openpyxl; extra == "full"
|
|
35
|
+
Provides-Extra: dev
|
|
36
|
+
Requires-Dist: manuel; extra == "dev"
|
|
37
|
+
Requires-Dist: pytest; extra == "dev"
|
|
38
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
39
|
+
Requires-Dist: coverage; extra == "dev"
|
|
40
|
+
Requires-Dist: mock; extra == "dev"
|
|
41
|
+
Dynamic: author
|
|
42
|
+
Dynamic: author-email
|
|
43
|
+
Dynamic: classifier
|
|
44
|
+
Dynamic: description
|
|
45
|
+
Dynamic: description-content-type
|
|
46
|
+
Dynamic: home-page
|
|
47
|
+
Dynamic: license-file
|
|
48
|
+
Dynamic: provides-extra
|
|
49
|
+
Dynamic: requires-dist
|
|
50
|
+
Dynamic: summary
|
|
42
51
|
|
|
43
52
|
# Teaspoon
|
|
44
53
|
|
|
@@ -75,5 +84,3 @@ Requires-Dist: openpyxl ; extra == 'rbr'
|
|
|
75
84
|
If you find this software helpful, please consider using the following citation:
|
|
76
85
|
|
|
77
86
|
> Brown, N., (2022). tsp ("Teaspoon"): A library for ground temperature data. Journal of Open Source Software, 7(77), 4704, [https://doi.org/10.21105/joss.04704](https://doi.org/10.21105/joss.04704)
|
|
78
|
-
|
|
79
|
-
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
tsp/__init__.py,sha256=V_rDl4XxSRtbFWK7KFZJkKqwjqwLREvlnVc7BCGjHaw,427
|
|
2
|
+
tsp/__meta__.py,sha256=tX7kLpRWOrz5cd1yN8hSxvnQEMfxFz00EFtGKA45M4k,93
|
|
3
|
+
tsp/concatenation.py,sha256=XK-5ec_IrlIVShp9eqd5QVg1yDgk3ysPFzeJpo2G2gc,5990
|
|
4
|
+
tsp/core.py,sha256=bRsX_qs7cGJtxe40V50TYulAMWaIzUj1EtQcVD56jtY,39915
|
|
5
|
+
tsp/gtnp.py,sha256=cFFSOVzudEkxqtXSMnsVE7clVoXFH0Gb8ES-Cx_iwUU,4269
|
|
6
|
+
tsp/labels.py,sha256=URV4zxfur6aYojdra7KGTipFdiN9pAOCEVvkcc2pj-Q,78
|
|
7
|
+
tsp/misc.py,sha256=y0NvW5jOlli5s220QnaLYTOadSlj3Lyu-EE-RsoSbok,2614
|
|
8
|
+
tsp/physics.py,sha256=hgVOGU0Bj1g-gxBNhLEl7Gm3VXJKIHHu35uPvgVMOxE,2699
|
|
9
|
+
tsp/readers.py,sha256=1rPcS9eRpkGPWU6MsSrgiMh2QCKvAAY5_KiTQMMcsxk,18464
|
|
10
|
+
tsp/time.py,sha256=82h7nxM-iXs2XwetF-alLtNvUm0qRtAA111gTMp5SY4,1379
|
|
11
|
+
tsp/tspwarnings.py,sha256=AGCmSlwM3JbnrEZSbyBKLnyQkKygsKU_YYbte4iZsK8,399
|
|
12
|
+
tsp/utils.py,sha256=sOJSZLmfv7sh4X971_gNgtZvXtS8ZwGmUdqnUybcVE4,2932
|
|
13
|
+
tsp/version.py,sha256=FS-CnweGXSAhfq0K-UkXsGZu941kSK-J2gYMkcnFVAI,15
|
|
14
|
+
tsp/data/2023-01-06_755-test-Dataset_2031-Constant_Over_Interval-Hourly-Ground_Temperature-Thermistor_Automated.timeserie.csv,sha256=Q3Ssnoo_kiSn9_orZHjtMxQ02YbrjCAEQKs5sHPFJCg,171
|
|
15
|
+
tsp/data/2023-01-06_755-test.metadata.txt,sha256=Ux1YGqmAmRQmMIqqK8-OloQXflg4Y45FRwdT-WgCg8c,5686
|
|
16
|
+
tsp/data/NTGS_example_csv.csv,sha256=OirFmLRqj7TUYfAUHqKbZFSqQ-g3I13QwUfUzgiJ-h4,554
|
|
17
|
+
tsp/data/NTGS_example_slash_dates.csv,sha256=RzeYXsGnOnmLqgrpeCr9pGi-ncaJSJKrsYvI5sf6xqo,554
|
|
18
|
+
tsp/data/example_geotop.csv,sha256=rgVP7_tGEvUtn1K_KI98VVgm275D7qt8YegKMe3Vjw4,262289
|
|
19
|
+
tsp/data/example_gtnp.csv,sha256=E5km06-cWlWMwzF-Qo7v0ZrlAvCTpyWIKY6hpzln4sc,191812
|
|
20
|
+
tsp/data/example_permos.csv,sha256=tz-Z4A9x3Uc8Dym65Roto95X_bgSUySC9wJrUnGVBPE,797
|
|
21
|
+
tsp/data/test_geotop_has_space.txt,sha256=BaloXQVxyPD7LLeI6YCnHsR3pjA_BZsHYH9OeW57cC4,203
|
|
22
|
+
tsp/dataloggers/AbstractReader.py,sha256=YsmESWrmH2jdL-Oli9pwjaFmPCEfJxjm4wx16FoRxpY,1777
|
|
23
|
+
tsp/dataloggers/FG2.py,sha256=kvfjMQtoSs5ZzV7hc1lJ_SaDuSOOTONfI_nw2VaihO8,3281
|
|
24
|
+
tsp/dataloggers/GP5W.py,sha256=dJ7I-P4_bIDDGb9zIdOf9vbxbxlcT3ZJ09HKLfRA6a0,3312
|
|
25
|
+
tsp/dataloggers/Geoprecision.py,sha256=pDljZDasj7PNdiI5lOEpHZ9n7CZJ1aGlX96rN4cuPHI,916
|
|
26
|
+
tsp/dataloggers/HOBO.py,sha256=xr5PvdMh_AO4CSsqdGLvtdVgfphc91Nl34Qs-AiP-wQ,33472
|
|
27
|
+
tsp/dataloggers/RBRXL800.py,sha256=NjS6g_-grnC8BmLLW7qUppeOBYAOUJODNR-GwahnI7Y,8538
|
|
28
|
+
tsp/dataloggers/RBRXR420.py,sha256=SH9tLLbosuDYRm06n9H7FsY9TUwaTqyS17B9ybXiq_c,14011
|
|
29
|
+
tsp/dataloggers/__init__.py,sha256=4QcIctP5hoVfraU3PwhkTIca-4JIWH9u6-j4CQWoW1g,410
|
|
30
|
+
tsp/dataloggers/logr.py,sha256=4IaqP6debop3QYnKWAyCzRxgve25txcr1itmtCciKkY,2665
|
|
31
|
+
tsp/dataloggers/test_files/004448.DAT,sha256=1eJg5PtOrwlbzitp1XB5uE64ksqQHIIjTNgKIDn7zkI,201018
|
|
32
|
+
tsp/dataloggers/test_files/004531.DAT,sha256=8Pag_PnR-3dK4rhr7os6kyQXVe8i1N5w1_ACefT9G4s,331292
|
|
33
|
+
tsp/dataloggers/test_files/004531.HEX,sha256=0qJio9SvecR2MS4-nkjcZwqLh8h0sKdB6js_6yKqy5k,118535
|
|
34
|
+
tsp/dataloggers/test_files/004534.HEX,sha256=cWMHCZ7JOu08RM2sjqay2aZiud35LY7NSsmBhjheGRI,118531
|
|
35
|
+
tsp/dataloggers/test_files/010252.dat,sha256=_f9rvVq6U3ms3YQlN05doiy46PaNwqjeDlVCZK9NeU0,171935
|
|
36
|
+
tsp/dataloggers/test_files/010252.hex,sha256=3o-A8c7v-KyQr0OR1CftJW1e7c6tyvY16MsZb_s0N74,84712
|
|
37
|
+
tsp/dataloggers/test_files/010274.hex,sha256=4nB6jBzsP3XsraXZ_87IZZbZCqLQRtWcQ2mvR4R1c0I,62720
|
|
38
|
+
tsp/dataloggers/test_files/010278.hex,sha256=8IOkmg1EC5mTj6vLECc9_t-Nb66Yp_dxcFCs6YzkCqo,173117
|
|
39
|
+
tsp/dataloggers/test_files/012064.dat,sha256=LgwK9p0uzV0f7Gt1kIJWQSZWmG25i3vOJmTaG2jQ9gM,127062
|
|
40
|
+
tsp/dataloggers/test_files/012064.hex,sha256=O2VReAh3xW-Rg-z8EJ0cR7aoVqvEfL6TpPkt5FXfagY,62921
|
|
41
|
+
tsp/dataloggers/test_files/012081.hex,sha256=MwCQT5VLWiUVCmQGlzAMjZMwvdKolPAgtIIIvB2Z4sU,172576
|
|
42
|
+
tsp/dataloggers/test_files/062834_20220904_2351.rsk,sha256=2DJa-wnrms1N_fJ9QmvcNFH5JMIBdBhcb-nXtUMp70k,1007616
|
|
43
|
+
tsp/dataloggers/test_files/062834_20220904_2351.xlsx,sha256=z2sE1P--zcQJ1FoVJu43kXoxs1wIhwXGBukwzt1nIbc,308908
|
|
44
|
+
tsp/dataloggers/test_files/07B1592.DAT,sha256=KalPKVVgzKTJrVQU8_3pmIJbEV1QJgXDUcJVwHnyYrY,107655
|
|
45
|
+
tsp/dataloggers/test_files/07B1592.HEX,sha256=Eav6F_ExQ7qfg-mBMkZqrsASgWLM1RafNW43o8H4vEE,59683
|
|
46
|
+
tsp/dataloggers/test_files/07B4450.DAT,sha256=1CpQviX4xhtkXL6wHENMmNvmJNarOAm6UcGL2G4AMZ8,162502
|
|
47
|
+
tsp/dataloggers/test_files/07B4450.HEX,sha256=MyjYMf9EwWi7c91JwrNd4n0cPyAYZT1w719MygMQWO4,84576
|
|
48
|
+
tsp/dataloggers/test_files/FG2_399.csv,sha256=Uonw_fFY3TUZ1O-XFtjRrV1yLr2iqUyBOlJM_wdZQGA,648322
|
|
49
|
+
tsp/dataloggers/test_files/GP5W.csv,sha256=2mQl3YfzFVtvi3pdkEfyw9Cam3TzeHqAMnY06JSU6co,36948
|
|
50
|
+
tsp/dataloggers/test_files/GP5W_260.csv,sha256=AbLBA12XLQLlNXpvht7Jy_DrvCUqhC1cQdFGnNYVXg0,68696
|
|
51
|
+
tsp/dataloggers/test_files/GP5W_270.csv,sha256=ApqjqasC9eu1Na9R-tUrF-4S4vG-iq3trAhuVKjOaFY,147550
|
|
52
|
+
tsp/dataloggers/test_files/H08-030-08_HOBOware.csv,sha256=uih-ZCFZRN9IF69RRVElvHfMGnaQ2-INljAsg_1x0BM,37920
|
|
53
|
+
tsp/dataloggers/test_files/RBR_01.dat,sha256=TAZxbVzZTEWoOAizBPgTHWyk01Ca6VVv7yU6NzUaFlU,82735
|
|
54
|
+
tsp/dataloggers/test_files/RBR_02.dat,sha256=xT8Q0F5D2wc2fxet1E7_dbb-BRbKK4rqT9bd6wInxEM,242142
|
|
55
|
+
tsp/dataloggers/test_files/RSTDT2055.csv,sha256=iB8Zx6BeQWKsrsvjlfhVwL3L0MdX-C0hPZ41DVEZuXU,470085
|
|
56
|
+
tsp/dataloggers/test_files/U23-001_HOBOware.csv,sha256=drFWVSYpTJxA9KMkdMoSnGJu1ibyWYBxtiSjhuzS4Hc,55854
|
|
57
|
+
tsp/dataloggers/test_files/hobo-negative-2.txt,sha256=hrPyh3YLz0AM4_g3mUSrPCvnuBWrturUlO3QbRnunYg,247057
|
|
58
|
+
tsp/dataloggers/test_files/hobo-negative-3.txt,sha256=H3AL-rLoF4BzKTC_cRTQxwARgAO541Vzp3tIizkr4zo,221034
|
|
59
|
+
tsp/dataloggers/test_files/hobo-positive-number-1.txt,sha256=IMIeeYa97NYq6cedWE9A0CkVJJAUNhpqkBfB8ktTmhU,36089
|
|
60
|
+
tsp/dataloggers/test_files/hobo-positive-number-2.csv,sha256=cwilKoPUCWR8k3cjK5SEKN9-QphFCHEmB-9CU-oQyQk,38331
|
|
61
|
+
tsp/dataloggers/test_files/hobo-positive-number-3.csv,sha256=syAQN7iU0KOVwBJDBO22K39W6exP8kDNGzxqpGwh6UQ,47776
|
|
62
|
+
tsp/dataloggers/test_files/hobo-positive-number-4.csv,sha256=0yg4uXthPDphZ5hEN5wZtjgV7QDtf0ApCsvcshnnh24,53444
|
|
63
|
+
tsp/dataloggers/test_files/hobo2.csv,sha256=RQZxaoKhexPPnwsDVm_vO5D6_g_yZ_pO2DodyinEQcA,531384
|
|
64
|
+
tsp/dataloggers/test_files/hobo_1_AB.config.json,sha256=Kmw1NFtrOASK-w2eqEtAOwFr4SY8Bf2LS8FITgpr1AE,408
|
|
65
|
+
tsp/dataloggers/test_files/hobo_1_AB.csv,sha256=LATTuvuhjv7A2FRK27ZZJyNJMairz3gb95NswGr8BZc,958834
|
|
66
|
+
tsp/dataloggers/test_files/hobo_1_AB_Details.txt,sha256=7hVLFp4FmastfM4BeByvjI-bst3jQsLaxR7V_8wIZrc,4333
|
|
67
|
+
tsp/dataloggers/test_files/hobo_1_AB_classic.csv,sha256=OBpUrCs2X59rLdoa6LII5lScN3k4TBfstgu8UmRGw6E,168846
|
|
68
|
+
tsp/dataloggers/test_files/hobo_1_AB_defaults.csv,sha256=7Xy43B5mln9WrvIQG7fNSXsFLIZy8E50rnAQXGsuW1s,987910
|
|
69
|
+
tsp/dataloggers/test_files/hobo_1_AB_minimal.txt,sha256=od_uIEWzk383rgAJ_LqXjplMICfY1kZ4Ly9qLOWyZQE,48977
|
|
70
|
+
tsp/dataloggers/test_files/hobo_1_AB_raw.hobo,sha256=0YYlDKQZCNkR1K6UiPAnsuZycmT4pxeDrhOSi4Fflm0,65536
|
|
71
|
+
tsp/dataloggers/test_files/hobo_1_AB_var2.csv,sha256=GfKmzq-QVLZq42ka7mX5cLCXrXyyZc71pI5b2qlTvbw,142070
|
|
72
|
+
tsp/dataloggers/test_files/hobo_1_AB_var3.csv,sha256=xwtPv3llA-LReippxcOUE20cBb_DBLJz_vOX0kd5tkY,92381
|
|
73
|
+
tsp/dataloggers/test_files/logR_ULogC16-32_1.csv,sha256=0HcCjf_jEBDpgpyTqiJC1oIoJsnt5Qdk4qV_s_KfuTQ,21966
|
|
74
|
+
tsp/dataloggers/test_files/logR_ULogC16-32_2.csv,sha256=MU58RvTSwFrhJIbaKPSSKf51tPyZC9_ZXgPCCfk9p4M,19066
|
|
75
|
+
tsp/dataloggers/test_files/mon_3_Ta_2010-08-18_2013-02-08.txt,sha256=Sqv23n-r1KLLdSsjjVeDvS-sX061Ivklhv5sDwRMwpA,734009
|
|
76
|
+
tsp/dataloggers/test_files/rbr_001.dat,sha256=pS1QV_he33ccbfUpZMWm54AYDekez5us4MxS917wh0g,111570
|
|
77
|
+
tsp/dataloggers/test_files/rbr_001.hex,sha256=HNrSlP05Y2LUqtvlzX_5O7rQrTGItUlZpMswra-dJpc,55293
|
|
78
|
+
tsp/dataloggers/test_files/rbr_001_no_comment.dat,sha256=s_-tc-ShQfYqc4ObMh35xr8tQBHDxwjuBLDftX6Pc9U,111547
|
|
79
|
+
tsp/dataloggers/test_files/rbr_001_no_comment.hex,sha256=HKG-sl7kw1A_Z3melKKT2xgVEAayv2fvCKzCFNM4LXA,55270
|
|
80
|
+
tsp/dataloggers/test_files/rbr_002.dat,sha256=tUIX8InqQHObWzDVZrv1vTmY02zpIeepbKDpv4p5cpA,93525
|
|
81
|
+
tsp/dataloggers/test_files/rbr_002.hex,sha256=W29e__jot7deVVC2XDtXwAgqfmvHzU7qi-7yQb4_mz0,57536
|
|
82
|
+
tsp/dataloggers/test_files/rbr_003.hex,sha256=cjUaYWGm39WthiPvdzQKaOQ5FEKj3U9rCIe_0my7v2M,62703
|
|
83
|
+
tsp/dataloggers/test_files/rbr_003.xls,sha256=PRxsKD88dTQEYOqz5z1FrkPox1jCkYyiBBZK0Kg-7tQ,263680
|
|
84
|
+
tsp/dataloggers/test_files/rbr_xl_001.DAT,sha256=yZXKaClXMtYWDCs1cD2xTVdGj6LBMLKSjKnTgB4qPio,80057
|
|
85
|
+
tsp/dataloggers/test_files/rbr_xl_002.DAT,sha256=JQNHL6X9z4Rp6IDqDBYx8vWsUU6oigl8nC23rMa3Enk,81601
|
|
86
|
+
tsp/dataloggers/test_files/rbr_xl_003.DAT,sha256=ZEKheCvB1CiubY2kMngigY0NNhWTYAiC_hmQhzODPYw,221656
|
|
87
|
+
tsp/dataloggers/test_files/rbr_xl_003.HEX,sha256=sunCD5C1t8l5y4p1b9iiHNsZUznYIuBLz4uwoGkZh3E,118459
|
|
88
|
+
tsp/plots/__init__.py,sha256=i5AhpNwyuT6il7uk2Vtc4YBjVnZ0ifvHNXw19rvDtsM,71
|
|
89
|
+
tsp/plots/static.py,sha256=pvLFM3_HuRgnPMe7smxj9v65zcM3JLsCvhhwGgdt5Uk,13836
|
|
90
|
+
tsp-1.8.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
91
|
+
tsp-1.8.1.dist-info/METADATA,sha256=_T7ZVlB3FOdmkzHzHUSTA7uSD2fI0GHRs79zRTqgIdY,3271
|
|
92
|
+
tsp-1.8.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
93
|
+
tsp-1.8.1.dist-info/top_level.txt,sha256=7tOR6y7BarphfWD2D7QFi_3F1jxagUZpHG8zwJIw4ck,30
|
|
94
|
+
tsp-1.8.1.dist-info/RECORD,,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
Wheel-Version: 1.0
|
|
2
|
-
Generator:
|
|
3
|
-
Root-Is-Purelib: true
|
|
4
|
-
Tag: py3-none-any
|
|
5
|
-
|
|
1
|
+
Wheel-Version: 1.0
|
|
2
|
+
Generator: setuptools (80.9.0)
|
|
3
|
+
Root-Is-Purelib: true
|
|
4
|
+
Tag: py3-none-any
|
|
5
|
+
|