cloudnetpy 1.65.3__py3-none-any.whl → 1.65.5__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/categorize/atmos_utils.py +2 -12
- cloudnetpy/constants.py +3 -0
- cloudnetpy/instruments/hatpro.py +1 -1
- cloudnetpy/instruments/rpg.py +5 -3
- cloudnetpy/instruments/rpg_reader.py +2 -2
- cloudnetpy/instruments/weather_station.py +2 -2
- cloudnetpy/plotting/plotting.py +38 -28
- cloudnetpy/version.py +1 -1
- {cloudnetpy-1.65.3.dist-info → cloudnetpy-1.65.5.dist-info}/METADATA +1 -1
- {cloudnetpy-1.65.3.dist-info → cloudnetpy-1.65.5.dist-info}/RECORD +13 -13
- {cloudnetpy-1.65.3.dist-info → cloudnetpy-1.65.5.dist-info}/WHEEL +1 -1
- {cloudnetpy-1.65.3.dist-info → cloudnetpy-1.65.5.dist-info}/LICENSE +0 -0
- {cloudnetpy-1.65.3.dist-info → cloudnetpy-1.65.5.dist-info}/top_level.txt +0 -0
@@ -1,13 +1,8 @@
|
|
1
|
-
from typing import Final
|
2
|
-
|
3
1
|
import numpy as np
|
4
2
|
from numpy import ma
|
5
3
|
|
6
4
|
import cloudnetpy.constants as con
|
7
5
|
|
8
|
-
HPA_TO_P: Final = 100
|
9
|
-
P_TO_HPA: Final = 0.01
|
10
|
-
|
11
6
|
|
12
7
|
def calc_wet_bulb_temperature(model_data: dict) -> np.ndarray:
|
13
8
|
"""Returns wet bulb temperature.
|
@@ -80,7 +75,7 @@ def calc_saturation_vapor_pressure(temperature: np.ndarray) -> np.ndarray:
|
|
80
75
|
+ 0.42873e-3 * (10 ** (4.76955 * (1 - ratio)) - 1)
|
81
76
|
+ 0.78614
|
82
77
|
)
|
83
|
-
) *
|
78
|
+
) * con.HPA_TO_PA
|
84
79
|
|
85
80
|
|
86
81
|
def calc_psychrometric_constant(pressure: np.ndarray) -> np.ndarray:
|
@@ -114,7 +109,7 @@ def calc_dew_point_temperature(vapor_pressure: np.ndarray) -> np.ndarray:
|
|
114
109
|
"""
|
115
110
|
vaisala_parameters_over_water = (6.116441, 7.591386, 240.7263)
|
116
111
|
a, m, tn = vaisala_parameters_over_water
|
117
|
-
dew_point_celsius = tn / ((m / np.log10(vapor_pressure *
|
112
|
+
dew_point_celsius = tn / ((m / np.log10(vapor_pressure * con.PA_TO_HPA / a)) - 1)
|
118
113
|
return c2k(dew_point_celsius)
|
119
114
|
|
120
115
|
|
@@ -126,8 +121,3 @@ def c2k(temp: np.ndarray) -> np.ndarray:
|
|
126
121
|
def k2c(temp: np.ndarray) -> np.ndarray:
|
127
122
|
"""Converts Kelvins to Celsius."""
|
128
123
|
return ma.array(temp) - 273.15
|
129
|
-
|
130
|
-
|
131
|
-
def mmh2ms(data: np.ndarray) -> np.ndarray:
|
132
|
-
"""Converts mm h-1 to m s-1."""
|
133
|
-
return data / con.SEC_IN_HOUR * con.MM_TO_M
|
cloudnetpy/constants.py
CHANGED
cloudnetpy/instruments/hatpro.py
CHANGED
cloudnetpy/instruments/rpg.py
CHANGED
@@ -10,9 +10,8 @@ from numpy import ma
|
|
10
10
|
from rpgpy import RPGFileError
|
11
11
|
|
12
12
|
from cloudnetpy import output, utils
|
13
|
-
from cloudnetpy.categorize.atmos_utils import mmh2ms
|
14
13
|
from cloudnetpy.cloudnetarray import CloudnetArray
|
15
|
-
from cloudnetpy.constants import G_TO_KG
|
14
|
+
from cloudnetpy.constants import G_TO_KG, HPA_TO_PA, KM_H_TO_M_S, MM_H_TO_M_S
|
16
15
|
from cloudnetpy.exceptions import InconsistentDataError, ValidTimeStampError
|
17
16
|
from cloudnetpy.instruments import instruments
|
18
17
|
from cloudnetpy.instruments.cloudnet_instrument import CloudnetInstrument
|
@@ -307,8 +306,11 @@ class Fmcw(Rpg):
|
|
307
306
|
|
308
307
|
def convert_units(self) -> None:
|
309
308
|
"""Converts units."""
|
310
|
-
self.data["rainfall_rate"].data =
|
309
|
+
self.data["rainfall_rate"].data = self.data["rainfall_rate"].data * MM_H_TO_M_S
|
311
310
|
self.data["lwp"].data *= G_TO_KG
|
311
|
+
self.data["relative_humidity"].data /= 100
|
312
|
+
self.data["air_pressure"].data *= HPA_TO_PA
|
313
|
+
self.data["wind_speed"].data *= KM_H_TO_M_S
|
312
314
|
|
313
315
|
@staticmethod
|
314
316
|
def _get_instrument(data: dict):
|
@@ -71,8 +71,8 @@ class Fmcw94Bin:
|
|
71
71
|
"QF": "quality_flag",
|
72
72
|
"RR": "rainfall_rate",
|
73
73
|
"RelHum": "relative_humidity",
|
74
|
-
"EnvTemp": "
|
75
|
-
"BaroP": "
|
74
|
+
"EnvTemp": "air_temperature",
|
75
|
+
"BaroP": "air_pressure",
|
76
76
|
"WS": "wind_speed",
|
77
77
|
"WD": "wind_direction",
|
78
78
|
"DDVolt": "voltage",
|
@@ -8,7 +8,7 @@ from numpy import ma
|
|
8
8
|
from cloudnetpy import output
|
9
9
|
from cloudnetpy.categorize import atmos_utils
|
10
10
|
from cloudnetpy.cloudnetarray import CloudnetArray
|
11
|
-
from cloudnetpy.constants import MM_H_TO_M_S, SEC_IN_HOUR
|
11
|
+
from cloudnetpy.constants import HPA_TO_PA, MM_H_TO_M_S, SEC_IN_HOUR
|
12
12
|
from cloudnetpy.exceptions import ValidTimeStampError, WeatherStationDataError
|
13
13
|
from cloudnetpy.instruments import instruments
|
14
14
|
from cloudnetpy.instruments.cloudnet_instrument import CloudnetInstrument
|
@@ -137,7 +137,7 @@ class WS(CloudnetInstrument):
|
|
137
137
|
self.data["rainfall_rate"].data = rainfall_rate / 60 / 1000 # mm/min -> m/s
|
138
138
|
|
139
139
|
def convert_pressure(self) -> None:
|
140
|
-
self.data["air_pressure"].data = self.data["air_pressure"][:] *
|
140
|
+
self.data["air_pressure"].data = self.data["air_pressure"][:] * HPA_TO_PA
|
141
141
|
|
142
142
|
def normalize_rainfall_amount(self) -> None:
|
143
143
|
if "rainfall_amount" in self.data:
|
cloudnetpy/plotting/plotting.py
CHANGED
@@ -678,29 +678,40 @@ class Plot1D(Plot):
|
|
678
678
|
def _plot_moving_average(self, figure_data: FigureData) -> None:
|
679
679
|
time = figure_data.time.copy()
|
680
680
|
data = self._data_orig.copy()
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
)
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
681
|
+
flags = self._read_flagged_data(figure_data)
|
682
|
+
is_invalid = ma.getmaskarray(data)
|
683
|
+
if np.any(flags):
|
684
|
+
is_invalid |= flags
|
685
|
+
|
686
|
+
is_wind_direction = self.sub_plot.variable.name == "wind_direction"
|
687
|
+
if is_wind_direction:
|
688
|
+
data = np.stack([figure_data.file["wind_speed"], data])
|
689
|
+
|
690
|
+
block_ind = np.where(np.diff(is_invalid))[0] + 1
|
691
|
+
valid_time_blocks = np.split(time, block_ind)[is_invalid[0] :: 2]
|
692
|
+
valid_data_blocks = np.split(data, block_ind)[is_invalid[0] :: 2]
|
693
|
+
|
694
|
+
for time1, data1 in zip(valid_time_blocks, valid_data_blocks, strict=False):
|
695
|
+
if is_wind_direction:
|
696
|
+
sma = self._calculate_average_wind_direction(
|
697
|
+
data1[0], data1[1], time1, window=15
|
698
|
+
)
|
699
|
+
else:
|
700
|
+
sma = self._calculate_moving_average(data1, time1, window=5)
|
701
|
+
gap_time = _get_max_gap_in_minutes(figure_data)
|
702
|
+
gaps = self._find_time_gap_indices(time1, max_gap_min=gap_time) + 1
|
703
|
+
|
704
|
+
for time2, data2 in zip(
|
705
|
+
np.split(time1, gaps), np.split(sma, gaps), strict=False
|
706
|
+
):
|
707
|
+
self._ax.plot(
|
708
|
+
time2,
|
709
|
+
data2,
|
710
|
+
color="slateblue",
|
711
|
+
lw=2,
|
712
|
+
label="_nolegend_",
|
713
|
+
zorder=_get_zorder("mean_curve"),
|
714
|
+
)
|
704
715
|
|
705
716
|
@staticmethod
|
706
717
|
def _get_line_width(time: ndarray) -> float:
|
@@ -736,12 +747,11 @@ class Plot1D(Plot):
|
|
736
747
|
window_size = int(window / 60 / time_delta_hours)
|
737
748
|
if window_size < 1:
|
738
749
|
window_size = 1
|
739
|
-
if
|
750
|
+
if window_size % 2 == 0:
|
740
751
|
window_size += 1
|
741
|
-
weights = np.repeat(1
|
742
|
-
|
743
|
-
|
744
|
-
return np.pad(sma, (edge, edge - 1), mode="constant", constant_values=np.nan)
|
752
|
+
weights = np.repeat(1 / window_size, window_size)
|
753
|
+
padded_data = np.pad(data, window_size // 2, mode="edge")
|
754
|
+
return np.convolve(padded_data, weights, "valid")
|
745
755
|
|
746
756
|
@classmethod
|
747
757
|
def _calculate_average_wind_direction(
|
cloudnetpy/version.py
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
cloudnetpy/__init__.py,sha256=X_FqY-4yg5GUj5Edo14SToLEos6JIsC3fN-v1FUgQoA,43
|
2
2
|
cloudnetpy/cloudnetarray.py,sha256=Ol1ha4RPAmFZANL__U5CaMKX4oYMXYR6OnjoCZ9w3eo,7077
|
3
3
|
cloudnetpy/concat_lib.py,sha256=8Ek059RMLAfbbXCkX90cgnhw_8ZpcDrxw1yPvwtuitU,9846
|
4
|
-
cloudnetpy/constants.py,sha256=
|
4
|
+
cloudnetpy/constants.py,sha256=Kn95HXVMsKFo9Bu-UOYSBJuPEOjBR4JLaEXH0-MBpwk,830
|
5
5
|
cloudnetpy/datasource.py,sha256=j7N4g59HPvOBWle-W9bOUF0BfRLgvR4zwOi_B50cI7Q,7921
|
6
6
|
cloudnetpy/exceptions.py,sha256=ns48useL9RN3mPh7CqIiLA19VI9OmVbyRsKTkwbThF8,1760
|
7
7
|
cloudnetpy/metadata.py,sha256=v_VDo2vbdTxB0zIsfP69IcrwSKiRlLpsGdq6JPI4CoA,5306
|
8
8
|
cloudnetpy/output.py,sha256=YkCaxVkG_Mt2hng_IVnhygHteV4UMKzKALkeFZwFJL8,14822
|
9
9
|
cloudnetpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
10
|
cloudnetpy/utils.py,sha256=JV0Fawnme1HoZgoiidV3eIzsn6vx0AEjBNmI1CcrBsA,28517
|
11
|
-
cloudnetpy/version.py,sha256=
|
11
|
+
cloudnetpy/version.py,sha256=7taBpMQJ9IcUdGe8zT3heZNDf-x-mFFQ3gSVNYJYWjw,72
|
12
12
|
cloudnetpy/categorize/__init__.py,sha256=gP5q3Vis1y9u9OWgA_idlbjfWXYN_S0IBSWdwBhL_uU,69
|
13
13
|
cloudnetpy/categorize/atmos.py,sha256=vavMC_WQQyGH14eL4vAzKLKDDZt8tBrMYimztYHOjH8,12639
|
14
|
-
cloudnetpy/categorize/atmos_utils.py,sha256=
|
14
|
+
cloudnetpy/categorize/atmos_utils.py,sha256=ns5ydiEN34Ng6mJiOBpxKBVDU2NXj6W3Q5IUynmNRYI,3586
|
15
15
|
cloudnetpy/categorize/categorize.py,sha256=VcxSs22icYDG3R5x9jTX7uuSjPU8tyc5bIz0Zj5F9z0,18303
|
16
16
|
cloudnetpy/categorize/classify.py,sha256=a-0bVCtynGfORnDGTsPuzqkuDeOOR_OMz5ai9NsMuic,9870
|
17
17
|
cloudnetpy/categorize/containers.py,sha256=g3SQHoqlY1uJ8b-MG-BbW3oWz5IyacA8kJBeIPy_4EA,4859
|
@@ -34,7 +34,7 @@ cloudnetpy/instruments/cl61d.py,sha256=g6DNBFju3wYhLFl32DKmC8pUup7y-EupXoUU0fuoG
|
|
34
34
|
cloudnetpy/instruments/cloudnet_instrument.py,sha256=RG5HJxGM6p0F-IGyr85fvOizcMmgx48OeD_XeIsrgSU,3367
|
35
35
|
cloudnetpy/instruments/copernicus.py,sha256=nmgqGOjVQFngj7BNbpcuCwA-W3yksvBbqn__iq7MyDk,6469
|
36
36
|
cloudnetpy/instruments/galileo.py,sha256=yQBedd7dmDnwuWi1MtXOsg4-RyRx0uRAXumCY4YuH9k,4686
|
37
|
-
cloudnetpy/instruments/hatpro.py,sha256=
|
37
|
+
cloudnetpy/instruments/hatpro.py,sha256=DzCWzTJxTc5BSOgoeyM8RjYkSXX6NDi3QXgKRp0uxlI,8759
|
38
38
|
cloudnetpy/instruments/instruments.py,sha256=jG5TYnZ8bdCZXnI303ZsaJBEdSKaIjKMbkGtnq6kQX0,3261
|
39
39
|
cloudnetpy/instruments/lufft.py,sha256=ugXF6pssHAAz1Y_hqPdpKuluAjxxHSR88xBmQuS6RlI,3705
|
40
40
|
cloudnetpy/instruments/mira.py,sha256=EyzEBTpWfDlgaspZVuIfaP4l73GYSVnSzEzBZc0lZNg,9333
|
@@ -43,11 +43,11 @@ cloudnetpy/instruments/nc_lidar.py,sha256=5gQG9PApnNPrHmS9_zanl8HEYIQuGRpbnzC3wf
|
|
43
43
|
cloudnetpy/instruments/nc_radar.py,sha256=7bKwIZZHM-RagW9AEdgldweaulfy9n61N3RH5fopTqo,6936
|
44
44
|
cloudnetpy/instruments/pollyxt.py,sha256=YuVEHr-BX31rtVOFsWGU-SQFAmcxpXL26eyCVMz_9hw,8933
|
45
45
|
cloudnetpy/instruments/radiometrics.py,sha256=ECN_bSfcV8Evdgfho9-Dl8RThXkAhHzIEj4DPOawSTc,7626
|
46
|
-
cloudnetpy/instruments/rpg.py,sha256=
|
47
|
-
cloudnetpy/instruments/rpg_reader.py,sha256=
|
46
|
+
cloudnetpy/instruments/rpg.py,sha256=IozvBJ8_qXTPqtp58FQwRsoI5_aI3-kycpXugZkS0d4,17462
|
47
|
+
cloudnetpy/instruments/rpg_reader.py,sha256=ThztFuVrWxhmWVAfZTfQDeUiKK1XMTbtv08IBe8GK98,11364
|
48
48
|
cloudnetpy/instruments/toa5.py,sha256=CfmmBMv5iMGaWHIGBK01Rw24cuXC1R1RMNTXkmsm340,1760
|
49
49
|
cloudnetpy/instruments/vaisala.py,sha256=GGuA_v4S7kR9yApSr1-d0ETzNj4ehEZ7-pD1-AdPYRE,14662
|
50
|
-
cloudnetpy/instruments/weather_station.py,sha256=
|
50
|
+
cloudnetpy/instruments/weather_station.py,sha256=IJw3qdyXkJf10LOfxcpFqGNRN5ThgYfR8l764FVc9l4,17503
|
51
51
|
cloudnetpy/instruments/disdrometer/__init__.py,sha256=lyjwttWvFvuwYxEkusoAvgRcbBmglmOp5HJOpXUqLWo,93
|
52
52
|
cloudnetpy/instruments/disdrometer/common.py,sha256=g52iK2aNp3Z88kovUmGVpC54NZomPa9D871gzO0AmQ4,9267
|
53
53
|
cloudnetpy/instruments/disdrometer/parsivel.py,sha256=HJZrEysQkx9MiIVPDV25CYHpXi_SjgZlgO-otoaKK34,25640
|
@@ -94,7 +94,7 @@ cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py,sha256=Ra3r4V
|
|
94
94
|
cloudnetpy/model_evaluation/tests/unit/test_tools.py,sha256=Ia_VrLdV2NstX5gbx_3AZTOAlrgLAy_xFZ8fHYVX0xI,3817
|
95
95
|
cloudnetpy/plotting/__init__.py,sha256=lg9Smn4BI0dVBgnDLC3JVJ4GmwoSnO-qoSd4ApvwV6Y,107
|
96
96
|
cloudnetpy/plotting/plot_meta.py,sha256=JHrr-4A9fhqdi_tQFe6mR4Fdry3hkI-lmmVu5Ny2vco,15979
|
97
|
-
cloudnetpy/plotting/plotting.py,sha256=
|
97
|
+
cloudnetpy/plotting/plotting.py,sha256=6Bnex4V1DI1G_8QscPzVQyukSposA89sP-FQtBEbLHQ,34059
|
98
98
|
cloudnetpy/products/__init__.py,sha256=2hRb5HG9hNrxH1if5laJkLeFeaZCd5W1q3hh4ewsX0E,273
|
99
99
|
cloudnetpy/products/classification.py,sha256=bNG8W1CMgGoUBpXopQjYAW3F-uEJGyojXb4A5jmErHo,7921
|
100
100
|
cloudnetpy/products/der.py,sha256=1LDBbnbUg8feMUTGWJq3bObBhEcZ_Ee17MB1x0GwRdo,12669
|
@@ -108,8 +108,8 @@ cloudnetpy/products/mie_lu_tables.nc,sha256=It4fYpqJXlqOgL8jeZ-PxGzP08PMrELIDVe5
|
|
108
108
|
cloudnetpy/products/mwr_tools.py,sha256=tN_sPDS3BdpFJfa5a2mnc3eCMoi7syjVJMaTt962hmo,5004
|
109
109
|
cloudnetpy/products/product_tools.py,sha256=VNw2diJj30POz68-3qNVkJP7r9AUspT_d1Fp0BbeIx8,10414
|
110
110
|
docs/source/conf.py,sha256=IKiFWw6xhUd8NrCg0q7l596Ck1d61XWeVjIFHVSG9Og,1490
|
111
|
-
cloudnetpy-1.65.
|
112
|
-
cloudnetpy-1.65.
|
113
|
-
cloudnetpy-1.65.
|
114
|
-
cloudnetpy-1.65.
|
115
|
-
cloudnetpy-1.65.
|
111
|
+
cloudnetpy-1.65.5.dist-info/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
|
112
|
+
cloudnetpy-1.65.5.dist-info/METADATA,sha256=CiSZoaISK9HEGkWWu0VRiYSjJ8E4YX3UUEQYXmLLqdg,5784
|
113
|
+
cloudnetpy-1.65.5.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
|
114
|
+
cloudnetpy-1.65.5.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
|
115
|
+
cloudnetpy-1.65.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|