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.
- cloudnetpy/instruments/bowtie.py +8 -0
- cloudnetpy/instruments/fd12p.py +42 -18
- cloudnetpy/utils.py +2 -0
- cloudnetpy/version.py +1 -1
- {cloudnetpy-1.77.0.dist-info → cloudnetpy-1.77.2.dist-info}/METADATA +1 -1
- {cloudnetpy-1.77.0.dist-info → cloudnetpy-1.77.2.dist-info}/RECORD +10 -10
- {cloudnetpy-1.77.0.dist-info → cloudnetpy-1.77.2.dist-info}/WHEEL +1 -1
- {cloudnetpy-1.77.0.dist-info → cloudnetpy-1.77.2.dist-info}/entry_points.txt +0 -0
- {cloudnetpy-1.77.0.dist-info → cloudnetpy-1.77.2.dist-info}/licenses/LICENSE +0 -0
- {cloudnetpy-1.77.0.dist-info → cloudnetpy-1.77.2.dist-info}/top_level.txt +0 -0
cloudnetpy/instruments/bowtie.py
CHANGED
@@ -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
|
cloudnetpy/instruments/fd12p.py
CHANGED
@@ -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
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
_parse_float(columns[11])
|
93
|
-
|
94
|
-
|
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
|
-
|
128
|
-
|
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
|
-
|
133
|
-
|
134
|
-
|
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
@@ -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=
|
12
|
-
cloudnetpy/version.py,sha256=
|
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=
|
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=
|
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.
|
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.
|
123
|
-
cloudnetpy-1.77.
|
124
|
-
cloudnetpy-1.77.
|
125
|
-
cloudnetpy-1.77.
|
126
|
-
cloudnetpy-1.77.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|