cloudnetpy 1.61.8__tar.gz → 1.61.10__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 (121) hide show
  1. {cloudnetpy-1.61.8/cloudnetpy.egg-info → cloudnetpy-1.61.10}/PKG-INFO +1 -1
  2. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/weather_station.py +103 -5
  3. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/version.py +1 -1
  4. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10/cloudnetpy.egg-info}/PKG-INFO +1 -1
  5. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/LICENSE +0 -0
  6. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/MANIFEST.in +0 -0
  7. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/README.md +0 -0
  8. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/__init__.py +0 -0
  9. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/categorize/__init__.py +0 -0
  10. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/categorize/atmos.py +0 -0
  11. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/categorize/atmos_utils.py +0 -0
  12. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/categorize/categorize.py +0 -0
  13. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/categorize/classify.py +0 -0
  14. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/categorize/containers.py +0 -0
  15. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/categorize/disdrometer.py +0 -0
  16. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/categorize/droplet.py +0 -0
  17. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/categorize/falling.py +0 -0
  18. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/categorize/freezing.py +0 -0
  19. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/categorize/insects.py +0 -0
  20. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/categorize/lidar.py +0 -0
  21. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/categorize/melting.py +0 -0
  22. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/categorize/model.py +0 -0
  23. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/categorize/mwr.py +0 -0
  24. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/categorize/radar.py +0 -0
  25. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/cloudnetarray.py +0 -0
  26. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/concat_lib.py +0 -0
  27. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/constants.py +0 -0
  28. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/datasource.py +0 -0
  29. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/exceptions.py +0 -0
  30. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/__init__.py +0 -0
  31. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/basta.py +0 -0
  32. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/campbell_scientific.py +0 -0
  33. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/ceilo.py +0 -0
  34. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/ceilometer.py +0 -0
  35. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/cl61d.py +0 -0
  36. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/cloudnet_instrument.py +0 -0
  37. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/copernicus.py +0 -0
  38. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/disdrometer/__init__.py +0 -0
  39. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/disdrometer/common.py +0 -0
  40. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/disdrometer/parsivel.py +0 -0
  41. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/disdrometer/thies.py +0 -0
  42. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/galileo.py +0 -0
  43. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/hatpro.py +0 -0
  44. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/instruments.py +0 -0
  45. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/lufft.py +0 -0
  46. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/mira.py +0 -0
  47. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/mrr.py +0 -0
  48. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/nc_lidar.py +0 -0
  49. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/nc_radar.py +0 -0
  50. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/pollyxt.py +0 -0
  51. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/radiometrics.py +0 -0
  52. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/rpg.py +0 -0
  53. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/rpg_reader.py +0 -0
  54. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/toa5.py +0 -0
  55. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/instruments/vaisala.py +0 -0
  56. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/metadata.py +0 -0
  57. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/__init__.py +0 -0
  58. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/file_handler.py +0 -0
  59. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/metadata.py +0 -0
  60. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/model_metadata.py +0 -0
  61. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/plotting/__init__.py +0 -0
  62. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/plotting/plot_meta.py +0 -0
  63. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/plotting/plot_tools.py +0 -0
  64. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/plotting/plotting.py +0 -0
  65. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/products/__init__.py +0 -0
  66. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/products/advance_methods.py +0 -0
  67. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/products/grid_methods.py +0 -0
  68. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/products/model_products.py +0 -0
  69. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/products/observation_products.py +0 -0
  70. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/products/product_resampling.py +0 -0
  71. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/products/tools.py +0 -0
  72. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/statistics/__init__.py +0 -0
  73. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/statistics/statistical_methods.py +0 -0
  74. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/__init__.py +0 -0
  75. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/e2e/__init__.py +0 -0
  76. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/e2e/conftest.py +0 -0
  77. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/e2e/process_cf/__init__.py +0 -0
  78. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +0 -0
  79. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +0 -0
  80. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/__init__.py +0 -0
  81. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +0 -0
  82. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +0 -0
  83. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/__init__.py +0 -0
  84. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +0 -0
  85. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +0 -0
  86. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/unit/__init__.py +0 -0
  87. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/unit/conftest.py +0 -0
  88. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +0 -0
  89. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +0 -0
  90. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/unit/test_model_products.py +0 -0
  91. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +0 -0
  92. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +0 -0
  93. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py +0 -0
  94. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +0 -0
  95. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/tests/unit/test_tools.py +0 -0
  96. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/model_evaluation/utils.py +0 -0
  97. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/output.py +0 -0
  98. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/plotting/__init__.py +0 -0
  99. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/plotting/plot_meta.py +0 -0
  100. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/plotting/plotting.py +0 -0
  101. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/products/__init__.py +0 -0
  102. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/products/classification.py +0 -0
  103. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/products/der.py +0 -0
  104. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/products/drizzle.py +0 -0
  105. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/products/drizzle_error.py +0 -0
  106. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/products/drizzle_tools.py +0 -0
  107. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/products/ier.py +0 -0
  108. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/products/iwc.py +0 -0
  109. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/products/lwc.py +0 -0
  110. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/products/mie_lu_tables.nc +0 -0
  111. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/products/mwr_tools.py +0 -0
  112. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/products/product_tools.py +0 -0
  113. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/py.typed +0 -0
  114. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy/utils.py +0 -0
  115. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy.egg-info/SOURCES.txt +0 -0
  116. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy.egg-info/dependency_links.txt +0 -0
  117. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy.egg-info/requires.txt +0 -0
  118. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/cloudnetpy.egg-info/top_level.txt +0 -0
  119. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/docs/source/conf.py +0 -0
  120. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/pyproject.toml +0 -0
  121. {cloudnetpy-1.61.8 → cloudnetpy-1.61.10}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudnetpy
3
- Version: 1.61.8
3
+ Version: 1.61.10
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -1,4 +1,6 @@
1
+ import csv
1
2
  import datetime
3
+ import math
2
4
 
3
5
  import numpy as np
4
6
  from numpy import ma
@@ -15,7 +17,7 @@ from cloudnetpy.utils import datetime2decimal_hours
15
17
 
16
18
 
17
19
  def ws2nc(
18
- weather_station_file: str,
20
+ weather_station_file: str | list[str],
19
21
  output_file: str,
20
22
  site_meta: dict,
21
23
  uuid: str | None = None,
@@ -38,12 +40,16 @@ def ws2nc(
38
40
  WeatherStationDataError : Unable to read the file.
39
41
  ValidTimeStampError: No valid timestamps found.
40
42
  """
43
+ if not isinstance(weather_station_file, list):
44
+ weather_station_file = [weather_station_file]
41
45
  try:
42
46
  ws: WS
43
47
  if site_meta["name"] == "Palaiseau":
44
48
  ws = PalaiseauWS(weather_station_file, site_meta)
45
49
  elif site_meta["name"] == "Granada":
46
50
  ws = GranadaWS(weather_station_file, site_meta)
51
+ elif site_meta["name"] == "Kenttärova":
52
+ ws = KenttarovaWS(weather_station_file, site_meta)
47
53
  else:
48
54
  msg = "Unsupported site"
49
55
  raise ValueError(msg) # noqa: TRY301
@@ -81,9 +87,11 @@ class WS(CloudnetInstrument):
81
87
 
82
88
 
83
89
  class PalaiseauWS(WS):
84
- def __init__(self, filename: str, site_meta: dict):
90
+ def __init__(self, filenames: list[str], site_meta: dict):
85
91
  super().__init__()
86
- self.filename = filename
92
+ if len(filenames) != 1:
93
+ raise ValueError
94
+ self.filename = filenames[0]
87
95
  self.site_meta = site_meta
88
96
  self.instrument = instruments.GENERIC_WEATHER_STATION
89
97
  self._data = self._read_data()
@@ -176,9 +184,11 @@ class PalaiseauWS(WS):
176
184
 
177
185
 
178
186
  class GranadaWS(WS):
179
- def __init__(self, filename: str, site_meta: dict):
187
+ def __init__(self, filenames: list[str], site_meta: dict):
188
+ if len(filenames) != 1:
189
+ raise ValueError
180
190
  super().__init__()
181
- self.filename = filename
191
+ self.filename = filenames[0]
182
192
  self.site_meta = site_meta
183
193
  self.instrument = instruments.GENERIC_WEATHER_STATION
184
194
  self._data = self._read_data()
@@ -262,6 +272,94 @@ class GranadaWS(WS):
262
272
  ) # mm -> m
263
273
 
264
274
 
275
+ class KenttarovaWS(WS):
276
+ def __init__(self, filenames: list[str], site_meta: dict):
277
+ super().__init__()
278
+ self.filenames = filenames
279
+ self.site_meta = site_meta
280
+ self.instrument = instruments.GENERIC_WEATHER_STATION
281
+ self._data = self._read_data()
282
+
283
+ def _read_data(self) -> dict:
284
+ merged: dict = {}
285
+ for filename in self.filenames:
286
+ with open(filename, newline="") as f:
287
+ reader = csv.DictReader(f)
288
+ raw_data: dict = {key: [] for key in reader.fieldnames} # type: ignore[union-attr]
289
+ for row in reader:
290
+ for key, value in row.items():
291
+ parsed_value: float | datetime.datetime
292
+ if key == "Read time (UTC+2)":
293
+ parsed_value = datetime.datetime.strptime(
294
+ value, "%Y-%m-%d %H:%M:%S"
295
+ ) - datetime.timedelta(hours=2)
296
+ else:
297
+ try:
298
+ parsed_value = float(value)
299
+ except ValueError:
300
+ parsed_value = math.nan
301
+ raw_data[key].append(parsed_value)
302
+ data = {
303
+ "time": raw_data["Read time (UTC+2)"],
304
+ "air_temperature": raw_data["Temp 2m (C)"],
305
+ "relative_humidity": raw_data["Humidity 2m (%)"],
306
+ "air_pressure": raw_data["Pressure (hPa)"],
307
+ "wind_speed": raw_data["Wind speed (m/s)"],
308
+ "wind_direction": raw_data["Wind dir (deg)"],
309
+ "rainfall_rate": raw_data["Precipitation (?)"],
310
+ }
311
+ if merged:
312
+ merged = {key: [*merged[key], *data[key]] for key in merged}
313
+ else:
314
+ merged = data
315
+ for key, value in merged.items():
316
+ new_value = np.array(value)
317
+ if key != "time":
318
+ new_value = ma.masked_where(np.isnan(new_value), new_value)
319
+ merged[key] = new_value
320
+ return merged
321
+
322
+ def convert_time(self) -> None:
323
+ pass
324
+
325
+ def screen_timestamps(self, date: str) -> None:
326
+ dates = [str(d.date()) for d in self._data["time"]]
327
+ valid_ind = [ind for ind, d in enumerate(dates) if d == date]
328
+ if not valid_ind:
329
+ raise ValidTimeStampError
330
+ for key in self._data:
331
+ self._data[key] = [
332
+ x for ind, x in enumerate(self._data[key]) if ind in valid_ind
333
+ ]
334
+
335
+ def add_date(self) -> None:
336
+ first_date = self._data["time"][0].date()
337
+ self.date = [
338
+ str(first_date.year),
339
+ str(first_date.month).zfill(2),
340
+ str(first_date.day).zfill(2),
341
+ ]
342
+
343
+ def add_data(self) -> None:
344
+ for key, value in self._data.items():
345
+ parsed = datetime2decimal_hours(value) if key == "time" else ma.array(value)
346
+ self.data[key] = CloudnetArray(parsed, key)
347
+ self.data["rainfall_amount"] = CloudnetArray(
348
+ ma.cumsum(self._data["rainfall_rate"]), "rainfall_amount"
349
+ )
350
+
351
+ def convert_units(self) -> None:
352
+ temperature_kelvins = atmos_utils.c2k(self.data["air_temperature"][:])
353
+ self.data["air_temperature"].data = temperature_kelvins
354
+ self.data["relative_humidity"].data = self.data["relative_humidity"][:] / 100
355
+ self.data["air_pressure"].data = self.data["air_pressure"][:] * 100 # hPa -> Pa
356
+ rainfall_rate = self.data["rainfall_rate"][:]
357
+ self.data["rainfall_rate"].data = rainfall_rate / 60 # m/min -> m/s
358
+ self.data["rainfall_amount"].data = (
359
+ self.data["rainfall_amount"][:] / 1000
360
+ ) # mm -> m
361
+
362
+
265
363
  ATTRIBUTES = {
266
364
  "rainfall_amount": MetaData(
267
365
  long_name="Rainfall amount",
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
2
  MINOR = 61
3
- PATCH = 8
3
+ PATCH = 10
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudnetpy
3
- Version: 1.61.8
3
+ Version: 1.61.10
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
File without changes
File without changes
File without changes
File without changes
File without changes