cloudnetpy 1.77.0__py3-none-any.whl → 1.77.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.
@@ -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/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
2
  MINOR = 77
3
- PATCH = 0
3
+ PATCH = 1
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.1
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -9,7 +9,7 @@ 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
11
  cloudnetpy/utils.py,sha256=SSZWk82c4nkAiTcLdOKGVvxt5ovETdAMn_TLxVeYpBY,33473
12
- cloudnetpy/version.py,sha256=2wWI0Vrxs-3sRV0GweamYgxmMxkoJvam_z0qRWpiarc,72
12
+ cloudnetpy/version.py,sha256=Uo3e3P2jzk9JhxwD31lPkG8Gt8Ya8hk34uy1zDz-P3o,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
@@ -40,7 +40,7 @@ cloudnetpy/instruments/ceilometer.py,sha256=ati9-fUQ54K9tvynIPB-nlBYwtvBVaQtUCjV
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.1.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.1.dist-info/METADATA,sha256=DB4u2OZnOarp7s73THnhEZxmmNq-czSCPTvP3EW7KPc,5796
123
+ cloudnetpy-1.77.1.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
124
+ cloudnetpy-1.77.1.dist-info/entry_points.txt,sha256=HhY7LwCFk4qFgDlXx_Fy983ZTd831WlhtdPIzV-Y3dY,51
125
+ cloudnetpy-1.77.1.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
126
+ cloudnetpy-1.77.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.4.0)
2
+ Generator: setuptools (80.7.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5