cloudnetpy 1.97.4__tar.gz → 1.97.6__tar.gz

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.
Files changed (148) hide show
  1. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/MANIFEST.in +1 -0
  2. {cloudnetpy-1.97.4/cloudnetpy.egg-info → cloudnetpy-1.97.6}/PKG-INFO +2 -24
  3. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/disdronator/parsivel.py +8 -5
  4. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/disdronator/process.py +7 -2
  5. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/disdrometer.py +21 -24
  6. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/version.py +1 -1
  7. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6/cloudnetpy.egg-info}/PKG-INFO +2 -24
  8. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy.egg-info/SOURCES.txt +1 -2
  9. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/pyproject.toml +2 -2
  10. cloudnetpy-1.97.4/docs/source/conf.py +0 -48
  11. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/LICENSE +0 -0
  12. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/README.md +0 -0
  13. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/__init__.py +0 -0
  14. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/arm.py +0 -0
  15. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/__init__.py +0 -0
  16. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/atmos_utils.py +0 -0
  17. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/attenuation.py +0 -0
  18. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/attenuations/__init__.py +0 -0
  19. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/attenuations/gas_attenuation.py +0 -0
  20. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/attenuations/liquid_attenuation.py +0 -0
  21. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/attenuations/melting_attenuation.py +0 -0
  22. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/attenuations/rain_attenuation.py +0 -0
  23. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/categorize.py +0 -0
  24. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/classify.py +0 -0
  25. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/containers.py +0 -0
  26. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/disdrometer.py +0 -0
  27. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/droplet.py +0 -0
  28. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/falling.py +0 -0
  29. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/freezing.py +0 -0
  30. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/insects.py +0 -0
  31. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/lidar.py +0 -0
  32. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/melting.py +0 -0
  33. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/model.py +0 -0
  34. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/mwr.py +0 -0
  35. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/categorize/radar.py +0 -0
  36. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/cli.py +0 -0
  37. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/cloudnetarray.py +0 -0
  38. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/concat_lib.py +0 -0
  39. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/constants.py +0 -0
  40. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/datasource.py +0 -0
  41. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/disdronator/__init__.py +0 -0
  42. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/disdronator/lpm.py +0 -0
  43. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/disdronator/rd80.py +0 -0
  44. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/disdronator/utils.py +0 -0
  45. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/exceptions.py +0 -0
  46. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/__init__.py +0 -0
  47. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/arm_ceilo.py +0 -0
  48. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/arm_ld.py +0 -0
  49. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/arm_utils.py +0 -0
  50. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/basta.py +0 -0
  51. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/bowtie.py +0 -0
  52. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/ceilo.py +0 -0
  53. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/ceilometer.py +0 -0
  54. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/cl61d.py +0 -0
  55. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/cloudnet_instrument.py +0 -0
  56. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/copernicus.py +0 -0
  57. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/da10.py +0 -0
  58. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/dealias.py +0 -0
  59. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/fd12p.py +0 -0
  60. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/galileo.py +0 -0
  61. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/hatpro.py +0 -0
  62. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/instruments.py +0 -0
  63. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/kazr.py +0 -0
  64. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/lufft.py +0 -0
  65. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/mira.py +0 -0
  66. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/mmcr.py +0 -0
  67. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/mrr.py +0 -0
  68. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/mwr3c.py +0 -0
  69. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/mwrlos.py +0 -0
  70. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/nc_lidar.py +0 -0
  71. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/nc_radar.py +0 -0
  72. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/pollyxt.py +0 -0
  73. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/radiometrics.py +0 -0
  74. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/rain_e_h3.py +0 -0
  75. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/rpg.py +0 -0
  76. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/rpg_reader.py +0 -0
  77. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/toa5.py +0 -0
  78. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/vaisala.py +0 -0
  79. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/weather_radar.py +0 -0
  80. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/instruments/weather_station.py +0 -0
  81. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/metadata.py +0 -0
  82. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/__init__.py +0 -0
  83. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/file_handler.py +0 -0
  84. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/metadata.py +0 -0
  85. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/model_metadata.py +0 -0
  86. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/plotting/__init__.py +0 -0
  87. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/plotting/plot_meta.py +0 -0
  88. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/plotting/plot_tools.py +0 -0
  89. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/plotting/plotting.py +0 -0
  90. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/products/__init__.py +0 -0
  91. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/products/advance_methods.py +0 -0
  92. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/products/grid_methods.py +0 -0
  93. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/products/model_products.py +0 -0
  94. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/products/observation_products.py +0 -0
  95. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/products/product_resampling.py +0 -0
  96. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/products/tools.py +0 -0
  97. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/statistics/__init__.py +0 -0
  98. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/statistics/statistical_methods.py +0 -0
  99. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/__init__.py +0 -0
  100. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/e2e/__init__.py +0 -0
  101. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/e2e/conftest.py +0 -0
  102. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/e2e/process_cf/__init__.py +0 -0
  103. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +0 -0
  104. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +0 -0
  105. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/__init__.py +0 -0
  106. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +0 -0
  107. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +0 -0
  108. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/__init__.py +0 -0
  109. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +0 -0
  110. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +0 -0
  111. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/unit/__init__.py +0 -0
  112. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/unit/conftest.py +0 -0
  113. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +0 -0
  114. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +0 -0
  115. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/unit/test_model_products.py +0 -0
  116. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +0 -0
  117. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +0 -0
  118. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py +0 -0
  119. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +0 -0
  120. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/tests/unit/test_tools.py +0 -0
  121. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/model_evaluation/utils.py +0 -0
  122. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/output.py +0 -0
  123. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/plotting/__init__.py +0 -0
  124. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/plotting/plot_meta.py +0 -0
  125. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/plotting/plotting.py +0 -0
  126. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/products/__init__.py +0 -0
  127. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/products/classification.py +0 -0
  128. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/products/cod.py +0 -0
  129. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/products/der.py +0 -0
  130. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/products/drizzle.py +0 -0
  131. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/products/drizzle_error.py +0 -0
  132. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/products/drizzle_tools.py +0 -0
  133. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/products/epsilon_lidar.py +0 -0
  134. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/products/epsilon_radar.py +0 -0
  135. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/products/ier.py +0 -0
  136. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/products/iwc.py +0 -0
  137. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/products/iwc_weather_radar.py +0 -0
  138. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/products/lwc.py +0 -0
  139. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/products/mie_lu_tables.nc +0 -0
  140. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/products/mwr_tools.py +0 -0
  141. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/products/product_tools.py +0 -0
  142. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/py.typed +0 -0
  143. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy/utils.py +0 -0
  144. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy.egg-info/dependency_links.txt +0 -0
  145. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy.egg-info/entry_points.txt +0 -0
  146. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy.egg-info/requires.txt +0 -0
  147. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/cloudnetpy.egg-info/top_level.txt +0 -0
  148. {cloudnetpy-1.97.4 → cloudnetpy-1.97.6}/setup.cfg +0 -0
@@ -1,3 +1,4 @@
1
1
  recursive-exclude tests *
2
+ recursive-exclude docs *
2
3
  include cloudnetpy/products/mie_lu_tables.nc
3
4
  include cloudnetpy/py.typed
@@ -1,37 +1,15 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudnetpy
3
- Version: 1.97.4
3
+ Version: 1.97.6
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
- License: MIT License
7
-
8
- Copyright (c) 2019-2026 Finnish Meteorological Institute
9
-
10
- Permission is hereby granted, free of charge, to any person obtaining a copy
11
- of this software and associated documentation files (the "Software"), to deal
12
- in the Software without restriction, including without limitation the rights
13
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
- copies of the Software, and to permit persons to whom the Software is
15
- furnished to do so, subject to the following conditions:
16
-
17
- The above copyright notice and this permission notice shall be included in all
18
- copies or substantial portions of the Software.
19
-
20
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
- SOFTWARE.
27
-
6
+ License-Expression: MIT
28
7
  Project-URL: Homepage, https://github.com/actris-cloudnet/cloudnetpy
29
8
  Project-URL: Documentation, https://actris-cloudnet.github.io/cloudnetpy/
30
9
  Project-URL: Repository, https://github.com/actris-cloudnet/cloudnetpy
31
10
  Project-URL: Changelog, https://github.com/actris-cloudnet/cloudnetpy/blob/main/CHANGELOG.md
32
11
  Classifier: Development Status :: 5 - Production/Stable
33
12
  Classifier: Intended Audience :: Science/Research
34
- Classifier: License :: OSI Approved :: MIT License
35
13
  Classifier: Operating System :: OS Independent
36
14
  Classifier: Programming Language :: Python :: 3
37
15
  Classifier: Topic :: Scientific/Engineering :: Atmospheric Science
@@ -1,4 +1,5 @@
1
1
  import datetime
2
+ import logging
2
3
  import re
3
4
  from collections.abc import Sequence
4
5
  from os import PathLike
@@ -586,11 +587,13 @@ def read_parsivel_l1(
586
587
  msg = "No raw data"
587
588
  raise ValueError(msg)
588
589
  data_raw = np.swapaxes(l0[93], 1, 2)
589
- interval = (
590
- l0[9]
591
- if 9 in l0
592
- else np.median(np.diff(time.astype("datetime64[s]"))).astype(int)
593
- )
590
+ if 9 in l0:
591
+ interval = l0[9]
592
+ else:
593
+ interval = np.median(np.diff(time.astype("datetime64[s]"))).astype(int)
594
+ logging.warning(
595
+ "Interval is not available, using mean time difference: %d s", interval
596
+ )
594
597
  return DisdroL1(
595
598
  diameter=D,
596
599
  diameter_bins=D_BINS,
@@ -1,3 +1,4 @@
1
+ import datetime
1
2
  from dataclasses import dataclass
2
3
 
3
4
  import numpy as np
@@ -80,7 +81,7 @@ def process_l2(l1: DisdroL1) -> DisdroL2:
80
81
  fall_velocity = ma.masked_where(spec == 0, np.tile(l1.velocity, (n_time, 1)))
81
82
  rain_amount = np.pi / 6 * np.sum(spec * l1.diameter**3 / area_mm2, axis=1)
82
83
  radar_refl = np.sum(
83
- spec * l1.diameter**6 / (l1.velocity * area_m2 * interval_h[:, np.newaxis]),
84
+ spec * l1.diameter**6 / (l1.velocity * area_m2 * interval[:, np.newaxis]),
84
85
  axis=1,
85
86
  )
86
87
  energy_flux = (
@@ -167,7 +168,11 @@ def process_l2(l1: DisdroL1) -> DisdroL2:
167
168
  )
168
169
  )
169
170
  rain_rate = rain_amount / interval_h
170
- rain_accum = np.cumsum(rain_amount)
171
+
172
+ # Typically time_diff matches interval, but in Bucharest time_diff is 60 s
173
+ # and interval is 5 s as of 2026-11-11.
174
+ time_diff = np.median(np.diff(time) / datetime.timedelta(hours=1))
175
+ rain_accum = np.cumsum(rain_rate * time_diff)
171
176
 
172
177
  min_radar_refl = -10
173
178
  radar_refl_db = 10 * ma.log10(radar_refl)
@@ -189,11 +189,14 @@ class Disdrometer(CloudnetInstrument):
189
189
  self.l0_reader = l0_reader
190
190
  self.l1_reader = l1_reader
191
191
  self.site_meta = site_meta
192
- self._read_data(filenames)
192
+ self._read_data(filenames, expected_date)
193
193
  self._process_data()
194
- self._screen_time(expected_date)
195
194
 
196
- def _read_data(self, filenames: Iterable[str | PathLike]) -> None:
195
+ def _read_data(
196
+ self,
197
+ filenames: Iterable[str | PathLike],
198
+ expected_date: datetime.date | None = None,
199
+ ) -> None:
197
200
  times = []
198
201
  data = defaultdict(list)
199
202
  for filename in filenames:
@@ -201,11 +204,23 @@ class Disdrometer(CloudnetInstrument):
201
204
  times.append(file_time)
202
205
  for key, value in file_data.items():
203
206
  data[key].append(value)
204
- self.l0_time = np.concatenate(times)
205
- if len(self.l0_time) == 0:
207
+ all_times = np.concatenate(times)
208
+ if len(all_times) == 0:
206
209
  msg = "No data found"
207
210
  raise DisdrometerDataError(msg)
208
- self.l0_data = {key: np.concatenate(value) for key, value in data.items()}
211
+ all_times, time_ind = np.unique(all_times, return_index=True)
212
+ if expected_date is None:
213
+ expected_date = all_times[0].date()
214
+ valid_ind = [t.date() == expected_date for t in all_times]
215
+ if not np.any(valid_ind):
216
+ msg = "No data found for expected date"
217
+ raise DisdrometerDataError(msg)
218
+ self.l0_time = all_times[valid_ind]
219
+ self.l0_data = {
220
+ key: np.concatenate(value)[time_ind][valid_ind]
221
+ for key, value in data.items()
222
+ }
223
+ self.date = expected_date
209
224
 
210
225
  def _process_data(self) -> None:
211
226
  l1 = self.l1_reader(self.l0_time, self.l0_data)
@@ -237,23 +252,6 @@ class Disdrometer(CloudnetInstrument):
237
252
  "visibility": np.round(l2.visibility).astype(np.int32),
238
253
  }
239
254
 
240
- def _screen_time(self, expected_date: datetime.date | None = None) -> None:
241
- if expected_date is None:
242
- expected_date = self.raw_time[0].date()
243
- is_valid = [dt.date() == expected_date for dt in self.raw_time]
244
- if not np.any(is_valid):
245
- msg = "No data found for expected date"
246
- raise DisdrometerDataError(msg)
247
- self.raw_time = self.raw_time[is_valid]
248
- for key in self.raw_data:
249
- self.raw_data[key] = self.raw_data[key][is_valid]
250
- self.date = expected_date
251
-
252
- def sort_and_dedup_timestamps(self) -> None:
253
- self.raw_time, time_ind = np.unique(self.raw_time, return_index=True)
254
- for key in self.raw_data:
255
- self.raw_data[key] = self.raw_data[key][time_ind]
256
-
257
255
  def add_meta(self) -> None:
258
256
  valid_keys = ("latitude", "longitude", "altitude")
259
257
  for key, value in self.site_meta.items():
@@ -345,7 +343,6 @@ def _process_disdrometer(
345
343
  input_file = [input_file]
346
344
  disdrometer = klass(l0_reader, l1_reader, input_file, site_meta, date)
347
345
  disdrometer.add_raw_data()
348
- disdrometer.sort_and_dedup_timestamps()
349
346
  disdrometer.convert_to_cloudnet_arrays()
350
347
  disdrometer.add_meta()
351
348
  attributes = output.add_time_attribute(attributes, disdrometer.date)
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
2
  MINOR = 97
3
- PATCH = 4
3
+ PATCH = 6
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,37 +1,15 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudnetpy
3
- Version: 1.97.4
3
+ Version: 1.97.6
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
- License: MIT License
7
-
8
- Copyright (c) 2019-2026 Finnish Meteorological Institute
9
-
10
- Permission is hereby granted, free of charge, to any person obtaining a copy
11
- of this software and associated documentation files (the "Software"), to deal
12
- in the Software without restriction, including without limitation the rights
13
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
- copies of the Software, and to permit persons to whom the Software is
15
- furnished to do so, subject to the following conditions:
16
-
17
- The above copyright notice and this permission notice shall be included in all
18
- copies or substantial portions of the Software.
19
-
20
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
- SOFTWARE.
27
-
6
+ License-Expression: MIT
28
7
  Project-URL: Homepage, https://github.com/actris-cloudnet/cloudnetpy
29
8
  Project-URL: Documentation, https://actris-cloudnet.github.io/cloudnetpy/
30
9
  Project-URL: Repository, https://github.com/actris-cloudnet/cloudnetpy
31
10
  Project-URL: Changelog, https://github.com/actris-cloudnet/cloudnetpy/blob/main/CHANGELOG.md
32
11
  Classifier: Development Status :: 5 - Production/Stable
33
12
  Classifier: Intended Audience :: Science/Research
34
- Classifier: License :: OSI Approved :: MIT License
35
13
  Classifier: Operating System :: OS Independent
36
14
  Classifier: Programming Language :: Python :: 3
37
15
  Classifier: Topic :: Scientific/Engineering :: Atmospheric Science
@@ -142,5 +142,4 @@ cloudnetpy/products/iwc_weather_radar.py
142
142
  cloudnetpy/products/lwc.py
143
143
  cloudnetpy/products/mie_lu_tables.nc
144
144
  cloudnetpy/products/mwr_tools.py
145
- cloudnetpy/products/product_tools.py
146
- docs/source/conf.py
145
+ cloudnetpy/products/product_tools.py
@@ -3,12 +3,12 @@ name = "cloudnetpy"
3
3
  description = "Python package for Cloudnet processing"
4
4
  authors = [{name = "Simo Tukiainen"}]
5
5
  readme = "README.md"
6
- license = {file = "LICENSE"}
6
+ license = "MIT"
7
+ license-files = ["LICENSE"]
7
8
  requires-python = ">=3.11"
8
9
  classifiers = [
9
10
  "Development Status :: 5 - Production/Stable",
10
11
  "Intended Audience :: Science/Research",
11
- "License :: OSI Approved :: MIT License",
12
12
  "Operating System :: OS Independent",
13
13
  "Programming Language :: Python :: 3",
14
14
  "Topic :: Scientific/Engineering :: Atmospheric Science",
@@ -1,48 +0,0 @@
1
- # noqa: INP001
2
- import os
3
- import sys
4
-
5
- sys.path.insert(0, os.path.abspath("../.."))
6
- sys.path.insert(0, os.path.abspath("../../cloudnetpy/"))
7
-
8
- # Configuration file for the Sphinx documentation builder.
9
- #
10
- # For the full list of built-in configuration values, see the documentation:
11
- # https://www.sphinx-doc.org/en/master/usage/configuration.html
12
-
13
- # -- Project information -----------------------------------------------------
14
- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
15
-
16
- # -- Project information -----------------------------------------------------
17
-
18
- project = "CloudnetPy"
19
- copyright = "2022, Finnish Meteorological Institute" # noqa: A001
20
- author = "Finnish Meteorological Institute"
21
-
22
- # -- General configuration ---------------------------------------------------
23
- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
24
-
25
- extensions = [
26
- "sphinx.ext.autodoc",
27
- "sphinx.ext.doctest",
28
- "sphinx.ext.imgmath",
29
- "sphinx.ext.viewcode",
30
- "sphinx.ext.napoleon",
31
- "sphinx.ext.todo",
32
- "sphinx.ext.autosummary",
33
- "sphinx.ext.autosectionlabel",
34
- ]
35
-
36
- templates_path = ["_templates"]
37
- exclude_patterns = ["_temp/*"]
38
- autodoc_member_order = "bysource"
39
- autosectionlabel_prefix_document = True
40
-
41
-
42
- # -- Options for HTML output -------------------------------------------------
43
- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
44
-
45
- html_theme = "sphinx_rtd_theme"
46
- html_static_path = ["_static"]
47
-
48
- napoleon_google_docstring = True
File without changes
File without changes
File without changes