tsp 1.8.0__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/__meta__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  # Automatically created. Please do not edit.
2
- __version__ = '1.8.0'
2
+ __version__ = '1.8.1'
3
3
  __author__ = 'Nick Brown'
tsp/core.py CHANGED
@@ -11,7 +11,7 @@ try:
11
11
  import netCDF4 as nc
12
12
 
13
13
  try:
14
- from pfit.pfnet_standard import make_temperature_base
14
+ from pfit.pfnet_standard import make_temperature_base, calculate_extent_metadata as calc_ext_meta
15
15
  except ModuleNotFoundError:
16
16
  warnings.warn("Missing pfit library. Some functionality will be limited.", stacklevel=2)
17
17
 
@@ -121,14 +121,46 @@ class TSP:
121
121
  self.__number_of_observations = np.ones_like(values, dtype=int)
122
122
  self.__number_of_observations[np.isnan(values)] = 0
123
123
  self.metadata = metadata
124
- self.latitude = latitude
125
- self.longitude = longitude
124
+ self._latitude = latitude
125
+ self._longitude = longitude
126
126
  self.site_id = site_id
127
127
  self._freq = None
128
128
  self._completeness = None
129
129
 
130
130
  self._export_precision = 3
131
131
 
132
+ @property
133
+ def latitude(self):
134
+ """ Latitude at which data were collected """
135
+ return self._latitude
136
+
137
+ @latitude.setter
138
+ def latitude(self, value: Optional[float]):
139
+ if value is not None:
140
+ try:
141
+ self._latitude = float(value)
142
+ except ValueError:
143
+ raise ValueError("Latitude must be a float or None.")
144
+ else:
145
+ self._latitude = None
146
+ self.metadata['_latitude'] = self._latitude
147
+
148
+ @property
149
+ def longitude(self):
150
+ """ Longitude at which data were collected """
151
+ return self._longitude
152
+
153
+ @longitude.setter
154
+ def longitude(self, value: Optional[float]):
155
+ if value is not None:
156
+ try:
157
+ self._longitude = float(value)
158
+ except ValueError:
159
+ raise ValueError("Longitude must be a float or None.")
160
+ else:
161
+ self._longitude = None
162
+ self.metadata['_longitude'] = self._longitude
163
+
132
164
  @property
133
165
  def freq(self) -> Optional[int]:
134
166
  """ Measurement frequency [s] """
@@ -648,7 +680,7 @@ class TSP:
648
680
 
649
681
  df.to_csv(filename, index=False, na_rep="-999")
650
682
 
651
- def to_ntgs(self, filename:str, project_name:str="", site_id:"Optional[str]" = None, latitude:"Optional[float]"=None, longitude:"Optional[float]"=None) -> None:
683
+ def to_ntgs(self, filename:str, project_name:Optional[str]="", site_id:"Optional[str]" = None, latitude:"Optional[float]"=None, longitude:"Optional[float]"=None) -> None:
652
684
  """ Write the data in NTGS template format
653
685
 
654
686
  Parameters
@@ -671,7 +703,11 @@ class TSP:
671
703
  longitude = self.longitude if self.longitude is not None else ""
672
704
 
673
705
  if site_id is None:
674
- site_id = self.site_id if self.site_id is not None else ""
706
+ site_id = self.site_id if self.site_id is not None else ""
707
+
708
+ if project_name is None:
709
+ project_name = self.metadata.get("project_name", "")
710
+
675
711
  data = self.values
676
712
 
677
713
  df = pd.DataFrame({'project_name': pd.Series(dtype='str'),
@@ -695,10 +731,10 @@ class TSP:
695
731
 
696
732
  df.to_csv(filename, index=False)
697
733
 
698
- def to_netcdf(self, file: str) -> None:
734
+ def to_netcdf(self, file: str, only_use_cf_metadata=True, calculate_extent_metadata=True) -> None:
699
735
  """ Write the data as a netcdf"""
700
736
  try:
701
- ncf = make_temperature_base(file, len(self.depths))
737
+ ncf = make_temperature_base(file, ndepth=len(self.depths), ntime=len(self.times), strings_as_strings=True)
702
738
  except NameError:
703
739
  warnings.warn("Missing required packages. Try installing with `pip install tsp[nc]`", stacklevel=2)
704
740
  return
@@ -717,14 +753,32 @@ class TSP:
717
753
  if self.longitude:
718
754
  ncd['longitude'][:] = self.longitude
719
755
  if self.site_id:
720
- ncd['site_name'] = self.site_id
756
+ if ncd['site_name'].dtype == str:
757
+ ncd['site_name'][0] = self.site_id
758
+ else:
759
+ strlen = ncd['site_name'].shape[0]
760
+ ncd['site_name'][:] = nc.stringtochar(np.array([self.site_id], f"S{strlen}"))
761
+
762
+ if "_elevation" in self.metadata:
763
+ ncd['surface_elevation'][:] = self.metadata.get("_elevation")
764
+
765
+ if only_use_cf_metadata:
766
+ metadata = self.metadata.get('CF', {})
767
+ else:
768
+ metadata = self.metadata
721
769
 
722
- for key, value in self.metadata:
770
+ for key, value in metadata.items():
723
771
  try:
724
- ncd.setncattr(key, value)
772
+ if isinstance(value, str):
773
+ ncd.setncattr_string(key, value)
774
+ else:
775
+ ncd.setncattr(key, value)
725
776
  except Exception:
726
- warnings.warn(f"Could not set metadata item: {key}", stacklevel=2)
777
+ warnings.warn(f"Could not set metadata item: {key} : {value}", stacklevel=2)
727
778
 
779
+ if calculate_extent_metadata:
780
+ calc_ext_meta(ncd)
781
+
728
782
  def to_json(self, file: str) -> None:
729
783
  """ Write the data to a serialized json file """
730
784
  with open(file, 'w') as f:
tsp/version.py CHANGED
@@ -1 +1 @@
1
- version="1.8.0"
1
+ version="1.8.1"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tsp
3
- Version: 1.8.0
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
@@ -27,10 +27,10 @@ Provides-Extra: rbr
27
27
  Requires-Dist: pyrsktools; extra == "rbr"
28
28
  Requires-Dist: openpyxl; extra == "rbr"
29
29
  Provides-Extra: full
30
- Requires-Dist: netCDF4; extra == "full"
31
- Requires-Dist: pyrsktools; extra == "full"
32
30
  Requires-Dist: scipy; extra == "full"
33
31
  Requires-Dist: pfit==0.2.1; extra == "full"
32
+ Requires-Dist: netCDF4; extra == "full"
33
+ Requires-Dist: pyrsktools; extra == "full"
34
34
  Requires-Dist: openpyxl; extra == "full"
35
35
  Provides-Extra: dev
36
36
  Requires-Dist: manuel; extra == "dev"
@@ -1,7 +1,7 @@
1
1
  tsp/__init__.py,sha256=V_rDl4XxSRtbFWK7KFZJkKqwjqwLREvlnVc7BCGjHaw,427
2
- tsp/__meta__.py,sha256=HPbBgUW82WNWV430sfTj9LXxF17fdFaQrKi-NL5mOo0,93
2
+ tsp/__meta__.py,sha256=tX7kLpRWOrz5cd1yN8hSxvnQEMfxFz00EFtGKA45M4k,93
3
3
  tsp/concatenation.py,sha256=XK-5ec_IrlIVShp9eqd5QVg1yDgk3ysPFzeJpo2G2gc,5990
4
- tsp/core.py,sha256=gXGyY08_EHo2rttH2nqKMD3hUnVBrPQbjlNm-2ZXMME,37899
4
+ tsp/core.py,sha256=bRsX_qs7cGJtxe40V50TYulAMWaIzUj1EtQcVD56jtY,39915
5
5
  tsp/gtnp.py,sha256=cFFSOVzudEkxqtXSMnsVE7clVoXFH0Gb8ES-Cx_iwUU,4269
6
6
  tsp/labels.py,sha256=URV4zxfur6aYojdra7KGTipFdiN9pAOCEVvkcc2pj-Q,78
7
7
  tsp/misc.py,sha256=y0NvW5jOlli5s220QnaLYTOadSlj3Lyu-EE-RsoSbok,2614
@@ -10,7 +10,7 @@ tsp/readers.py,sha256=1rPcS9eRpkGPWU6MsSrgiMh2QCKvAAY5_KiTQMMcsxk,18464
10
10
  tsp/time.py,sha256=82h7nxM-iXs2XwetF-alLtNvUm0qRtAA111gTMp5SY4,1379
11
11
  tsp/tspwarnings.py,sha256=AGCmSlwM3JbnrEZSbyBKLnyQkKygsKU_YYbte4iZsK8,399
12
12
  tsp/utils.py,sha256=sOJSZLmfv7sh4X971_gNgtZvXtS8ZwGmUdqnUybcVE4,2932
13
- tsp/version.py,sha256=Xzb-lP-C0B-Xa7NdEdQP8ANIyFtMIaeq0GhSeSluzrk,15
13
+ tsp/version.py,sha256=FS-CnweGXSAhfq0K-UkXsGZu941kSK-J2gYMkcnFVAI,15
14
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
15
  tsp/data/2023-01-06_755-test.metadata.txt,sha256=Ux1YGqmAmRQmMIqqK8-OloQXflg4Y45FRwdT-WgCg8c,5686
16
16
  tsp/data/NTGS_example_csv.csv,sha256=OirFmLRqj7TUYfAUHqKbZFSqQ-g3I13QwUfUzgiJ-h4,554
@@ -87,8 +87,8 @@ tsp/dataloggers/test_files/rbr_xl_003.DAT,sha256=ZEKheCvB1CiubY2kMngigY0NNhWTYAi
87
87
  tsp/dataloggers/test_files/rbr_xl_003.HEX,sha256=sunCD5C1t8l5y4p1b9iiHNsZUznYIuBLz4uwoGkZh3E,118459
88
88
  tsp/plots/__init__.py,sha256=i5AhpNwyuT6il7uk2Vtc4YBjVnZ0ifvHNXw19rvDtsM,71
89
89
  tsp/plots/static.py,sha256=pvLFM3_HuRgnPMe7smxj9v65zcM3JLsCvhhwGgdt5Uk,13836
90
- tsp-1.8.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
91
- tsp-1.8.0.dist-info/METADATA,sha256=rvZdIOFdzkkQe3Euae8ESNPAL2p6HukH2BRj-r2Auys,3271
92
- tsp-1.8.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
93
- tsp-1.8.0.dist-info/top_level.txt,sha256=7tOR6y7BarphfWD2D7QFi_3F1jxagUZpHG8zwJIw4ck,30
94
- tsp-1.8.0.dist-info/RECORD,,
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,,
File without changes