cloudnetpy 1.77.0__py3-none-any.whl → 1.77.2__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.
@@ -1,5 +1,7 @@
1
1
  from os import PathLike
2
2
 
3
+ import numpy as np
4
+
3
5
  from cloudnetpy import output
4
6
  from cloudnetpy.constants import G_TO_KG, MM_H_TO_M_S
5
7
  from cloudnetpy.exceptions import ValidTimeStampError
@@ -59,6 +61,7 @@ def bowtie2nc(
59
61
  bowtie.add_site_geolocation()
60
62
  bowtie.add_height()
61
63
  bowtie.convert_units()
64
+ bowtie.fix_chirp_start_indices()
62
65
  bowtie.test_if_all_masked()
63
66
  attributes = output.add_time_attribute(ATTRIBUTES, bowtie.date)
64
67
  output.update_attributes(bowtie.data, attributes)
@@ -76,6 +79,11 @@ class Bowtie(NcRadar):
76
79
  self.data["rainfall_rate"].data *= MM_H_TO_M_S
77
80
  self.data["relative_humidity"].data /= 100
78
81
 
82
+ def fix_chirp_start_indices(self) -> None:
83
+ ind = self.data["chirp_start_indices"].data
84
+ self.data["chirp_start_indices"].data = np.array([int(i) for i in ind])
85
+ self.data["chirp_start_indices"].data_type = "int32"
86
+
79
87
  def check_date(self, date: str):
80
88
  if "-".join(self.date) != date:
81
89
  raise ValidTimeStampError
@@ -1,5 +1,7 @@
1
1
  import datetime
2
+ import logging
2
3
  import math
4
+ import re
3
5
  from os import PathLike
4
6
  from uuid import UUID
5
7
 
@@ -78,20 +80,31 @@ class FD12P(CSVFile):
78
80
  # In Lindenberg, format is date and time followed by Message 2 without
79
81
  # non-printable characters.
80
82
  with open(filename) as file:
83
+ invalid_lines = 0
81
84
  for line in file:
82
- columns = line.split()
83
- date = _parse_date(columns[0])
84
- time = _parse_time(columns[1])
85
- self._data["time"].append(datetime.datetime.combine(date, time))
86
- self._data["visibility"].append(_parse_int(columns[4]))
87
- self._data["synop_WaWa"].append(_parse_int(columns[7]))
88
- self._data["precipitation_rate"].append(
89
- _parse_float(columns[10])
90
- ) # mm/h
91
- self._data["precipitation_amount"].append(
92
- _parse_float(columns[11])
93
- ) # mm
94
- self._data["snowfall_amount"].append(_parse_int(columns[12])) # mm
85
+ try:
86
+ columns = line.split()
87
+ if len(columns) != 13:
88
+ msg = "Invalid column count"
89
+ raise ValueError(msg) # noqa: TRY301
90
+ date = _parse_date(columns[0])
91
+ time = _parse_time(columns[1])
92
+ visibility = _parse_int(columns[4])
93
+ synop = _parse_int(columns[7])
94
+ p_rate = _parse_float(columns[10]) # mm/h
95
+ p_amount = _parse_float(columns[11]) # mm
96
+ s_amount = _parse_int(columns[12]) # mm
97
+ self._data["time"].append(datetime.datetime.combine(date, time))
98
+ self._data["visibility"].append(visibility)
99
+ self._data["synop_WaWa"].append(synop)
100
+ self._data["precipitation_rate"].append(p_rate)
101
+ self._data["precipitation_amount"].append(p_amount)
102
+ self._data["snowfall_amount"].append(s_amount)
103
+ except ValueError:
104
+ invalid_lines += 1
105
+ continue
106
+ if invalid_lines:
107
+ logging.info("Skipped %d lines", invalid_lines)
95
108
  for key in ("visibility", "synop_WaWa", "snowfall_amount"):
96
109
  values = np.array(
97
110
  [0 if x is math.nan else x for x in self._data[key]], dtype=np.int32
@@ -124,14 +137,25 @@ class FD12P(CSVFile):
124
137
 
125
138
 
126
139
  def _parse_date(date: str) -> datetime.date:
127
- day, month, year = map(int, date.split("."))
128
- return datetime.date(year, month, day)
140
+ match = re.fullmatch(r"(?P<day>\d{2})\.(?P<month>\d{2})\.(?P<year>\d{4})", date)
141
+ if match is None:
142
+ msg = f"Invalid date: {date}"
143
+ raise ValueError(msg)
144
+ return datetime.date(int(match["year"]), int(match["month"]), int(match["day"]))
129
145
 
130
146
 
131
147
  def _parse_time(time: str) -> datetime.time:
132
- hour, minute, *rest = [int(x) for x in time.split(":")]
133
- second = rest[0] if rest else 0
134
- return datetime.time(hour, minute, second)
148
+ match = re.fullmatch(
149
+ r"(?P<hour>\d{2}):(?P<minute>\d{2})(:(?P<second>\d{2}))?", time
150
+ )
151
+ if match is None:
152
+ msg = f"Invalid time: {time}"
153
+ raise ValueError(msg)
154
+ return datetime.time(
155
+ int(match["hour"]),
156
+ int(match["minute"]),
157
+ int(match["second"]) if match["second"] is not None else 0,
158
+ )
135
159
 
136
160
 
137
161
  def _parse_int(value: str) -> float:
cloudnetpy/utils.py CHANGED
@@ -826,6 +826,8 @@ def get_epoch(units: str) -> Epoch:
826
826
  except IndexError:
827
827
  return fallback
828
828
  date = date.replace(",", "")
829
+ if "T" in date:
830
+ date = date[: date.index("T")]
829
831
  try:
830
832
  date_components = [int(x) for x in date.split("-")]
831
833
  except ValueError:
cloudnetpy/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
2
  MINOR = 77
3
- PATCH = 0
3
+ PATCH = 2
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudnetpy
3
- Version: 1.77.0
3
+ Version: 1.77.2
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -8,8 +8,8 @@ cloudnetpy/exceptions.py,sha256=hYbUtBwjCIfxnPe_5mELDEw87AWITBrwuo7WYIEKmJ8,1579
8
8
  cloudnetpy/metadata.py,sha256=lO7BCbVAzFoH3Nq-VuezYX0f7MnbG1Zp11g5GSiuQwM,6189
9
9
  cloudnetpy/output.py,sha256=l0LoOhcGCBrg2EJ4NT1xZ7-UKWdV7X7yQ0fJmhkwJVc,15829
10
10
  cloudnetpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- cloudnetpy/utils.py,sha256=SSZWk82c4nkAiTcLdOKGVvxt5ovETdAMn_TLxVeYpBY,33473
12
- cloudnetpy/version.py,sha256=2wWI0Vrxs-3sRV0GweamYgxmMxkoJvam_z0qRWpiarc,72
11
+ cloudnetpy/utils.py,sha256=FFV4MRoiJfcbbknMD5DM-VesY-7yCb8jzeeadyyijLg,33532
12
+ cloudnetpy/version.py,sha256=MBEzrrjK2C6qfoMHCRMYDIMl98CZIE1aPKuEZsjCPeo,72
13
13
  cloudnetpy/categorize/__init__.py,sha256=s-SJaysvVpVVo5kidiruWQO6p3gv2TXwY1wEHYO5D6I,44
14
14
  cloudnetpy/categorize/atmos_utils.py,sha256=RcmbKxm2COkE7WEya0mK3yX5rzUbrewRVh3ekm01RtM,10598
15
15
  cloudnetpy/categorize/attenuation.py,sha256=Y_-fzmQTltWTqIZTulJhovC7a6ifpMcaAazDJcnMIOc,990
@@ -34,13 +34,13 @@ cloudnetpy/categorize/attenuations/melting_attenuation.py,sha256=9c9xoZHtGUbjFYJ
34
34
  cloudnetpy/categorize/attenuations/rain_attenuation.py,sha256=qazJzRyXf9vbjJhh4yiFmABI4L57j5W_6YZ-6qjRiBI,2839
35
35
  cloudnetpy/instruments/__init__.py,sha256=PEgrrQNoiOuN_ctYilmt4LV2QCLg1likPjJdWtuGlLs,528
36
36
  cloudnetpy/instruments/basta.py,sha256=Lb_EhQTI93S5Bd9osDbCE_tC8gZreRsHz7D2_dFOjmE,3793
37
- cloudnetpy/instruments/bowtie.py,sha256=Hp4mzjGqvYw5bhgAy_LvScYrf3Xm3ULbtPjhG9GnAJ8,2977
37
+ cloudnetpy/instruments/bowtie.py,sha256=jrEkOsZ4ScwmTN35rAwIbVHkHxQatFCHiuzBjVA4pJ0,3279
38
38
  cloudnetpy/instruments/ceilo.py,sha256=qM3AkQKHUblhRCD42HsB6lr82giBH-0g_VzoWHZDgeA,9535
39
39
  cloudnetpy/instruments/ceilometer.py,sha256=ati9-fUQ54K9tvynIPB-nlBYwtvBVaQtUCjVCLNB67w,12059
40
40
  cloudnetpy/instruments/cl61d.py,sha256=g6DNBFju3wYhLFl32DKmC8pUup7y-EupXoUU0fuoGGA,1990
41
41
  cloudnetpy/instruments/cloudnet_instrument.py,sha256=SGPsRYYoGPoRoDY7hHJcKUVX0A23X0Telc00Fu01PnY,4495
42
42
  cloudnetpy/instruments/copernicus.py,sha256=99idcn6-iKOSvSslNjwFRng3gwlTLFjKPiT1tnVytpQ,6613
43
- cloudnetpy/instruments/fd12p.py,sha256=LNY_yYk9DshGkNJvGEhOsgDmfpHGZOFRRJAYkT_Qw0M,5868
43
+ cloudnetpy/instruments/fd12p.py,sha256=aGYpkczdSl7FSmK1bByMnpUBD5GAl7RTKkopt0cpWas,6822
44
44
  cloudnetpy/instruments/galileo.py,sha256=BjWE15_S3tTCOmAM5k--oicI3wghKaO0hv9EUBxtbl8,4830
45
45
  cloudnetpy/instruments/hatpro.py,sha256=G1fHsY9LTos4vHP5kFubjE5Wg2uTVFZpYDSD8VAo-zw,9590
46
46
  cloudnetpy/instruments/instruments.py,sha256=z8Osjww3iQRxKvzXdISl-5vV6gShtji8Db5k-ZzDQ-0,4843
@@ -117,10 +117,10 @@ cloudnetpy/products/lwc.py,sha256=sl6Al2tuH3KkCBrPbWTmuz3jlD5UQJ4D6qBsn1tt2CQ,18
117
117
  cloudnetpy/products/mie_lu_tables.nc,sha256=It4fYpqJXlqOgL8jeZ-PxGzP08PMrELIDVe55y9ob58,16637951
118
118
  cloudnetpy/products/mwr_tools.py,sha256=8HPZpQMTojKZP1JS1S83IE0sxmbDE9bxlaWoqmGnUZE,6199
119
119
  cloudnetpy/products/product_tools.py,sha256=uu4l6reuGbPcW3TgttbaSrqIKbyYGhBVTdnC7opKvmg,11101
120
- cloudnetpy-1.77.0.dist-info/licenses/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
120
+ cloudnetpy-1.77.2.dist-info/licenses/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
121
121
  docs/source/conf.py,sha256=IKiFWw6xhUd8NrCg0q7l596Ck1d61XWeVjIFHVSG9Og,1490
122
- cloudnetpy-1.77.0.dist-info/METADATA,sha256=tEn0YbqanXZxITD44cJM-bw_30aA1s-lwhIZQEJjtzA,5796
123
- cloudnetpy-1.77.0.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
124
- cloudnetpy-1.77.0.dist-info/entry_points.txt,sha256=HhY7LwCFk4qFgDlXx_Fy983ZTd831WlhtdPIzV-Y3dY,51
125
- cloudnetpy-1.77.0.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
126
- cloudnetpy-1.77.0.dist-info/RECORD,,
122
+ cloudnetpy-1.77.2.dist-info/METADATA,sha256=soDh6zzIkRMSYIeYp6NiOTksTWZX0zttG8MnWJuFjNs,5796
123
+ cloudnetpy-1.77.2.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
124
+ cloudnetpy-1.77.2.dist-info/entry_points.txt,sha256=HhY7LwCFk4qFgDlXx_Fy983ZTd831WlhtdPIzV-Y3dY,51
125
+ cloudnetpy-1.77.2.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
126
+ cloudnetpy-1.77.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.4.0)
2
+ Generator: setuptools (80.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5