cloudnetpy 1.68.0__tar.gz → 1.69.0__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 (130) hide show
  1. {cloudnetpy-1.68.0/cloudnetpy.egg-info → cloudnetpy-1.69.0}/PKG-INFO +1 -1
  2. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/model.py +2 -2
  3. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/rain_e_h3.py +2 -0
  4. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/weather_station.py +49 -1
  5. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/version.py +1 -1
  6. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0/cloudnetpy.egg-info}/PKG-INFO +1 -1
  7. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/LICENSE +0 -0
  8. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/MANIFEST.in +0 -0
  9. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/README.md +0 -0
  10. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/__init__.py +0 -0
  11. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/__init__.py +0 -0
  12. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/atmos_utils.py +0 -0
  13. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/attenuation.py +0 -0
  14. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/attenuations/__init__.py +0 -0
  15. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/attenuations/gas_attenuation.py +0 -0
  16. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/attenuations/liquid_attenuation.py +0 -0
  17. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/attenuations/melting_attenuation.py +0 -0
  18. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/attenuations/rain_attenuation.py +0 -0
  19. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/categorize.py +0 -0
  20. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/classify.py +0 -0
  21. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/containers.py +0 -0
  22. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/disdrometer.py +0 -0
  23. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/droplet.py +0 -0
  24. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/falling.py +0 -0
  25. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/freezing.py +0 -0
  26. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/insects.py +0 -0
  27. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/itu.py +0 -0
  28. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/lidar.py +0 -0
  29. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/melting.py +0 -0
  30. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/mwr.py +0 -0
  31. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/categorize/radar.py +0 -0
  32. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/cli.py +0 -0
  33. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/cloudnetarray.py +0 -0
  34. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/concat_lib.py +0 -0
  35. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/constants.py +0 -0
  36. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/datasource.py +0 -0
  37. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/exceptions.py +0 -0
  38. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/__init__.py +0 -0
  39. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/basta.py +0 -0
  40. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/campbell_scientific.py +0 -0
  41. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/ceilo.py +0 -0
  42. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/ceilometer.py +0 -0
  43. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/cl61d.py +0 -0
  44. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/cloudnet_instrument.py +0 -0
  45. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/copernicus.py +0 -0
  46. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/disdrometer/__init__.py +0 -0
  47. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/disdrometer/common.py +0 -0
  48. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/disdrometer/parsivel.py +0 -0
  49. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/disdrometer/thies.py +0 -0
  50. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/galileo.py +0 -0
  51. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/hatpro.py +0 -0
  52. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/instruments.py +0 -0
  53. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/lufft.py +0 -0
  54. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/mira.py +0 -0
  55. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/mrr.py +0 -0
  56. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/nc_lidar.py +0 -0
  57. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/nc_radar.py +0 -0
  58. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/pollyxt.py +0 -0
  59. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/radiometrics.py +0 -0
  60. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/rpg.py +0 -0
  61. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/rpg_reader.py +0 -0
  62. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/toa5.py +0 -0
  63. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/instruments/vaisala.py +0 -0
  64. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/metadata.py +0 -0
  65. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/__init__.py +0 -0
  66. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/file_handler.py +0 -0
  67. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/metadata.py +0 -0
  68. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/model_metadata.py +0 -0
  69. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/plotting/__init__.py +0 -0
  70. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/plotting/plot_meta.py +0 -0
  71. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/plotting/plot_tools.py +0 -0
  72. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/plotting/plotting.py +0 -0
  73. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/products/__init__.py +0 -0
  74. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/products/advance_methods.py +0 -0
  75. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/products/grid_methods.py +0 -0
  76. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/products/model_products.py +0 -0
  77. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/products/observation_products.py +0 -0
  78. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/products/product_resampling.py +0 -0
  79. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/products/tools.py +0 -0
  80. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/statistics/__init__.py +0 -0
  81. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/statistics/statistical_methods.py +0 -0
  82. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/__init__.py +0 -0
  83. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/e2e/__init__.py +0 -0
  84. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/e2e/conftest.py +0 -0
  85. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/e2e/process_cf/__init__.py +0 -0
  86. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +0 -0
  87. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +0 -0
  88. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/__init__.py +0 -0
  89. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +0 -0
  90. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +0 -0
  91. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/__init__.py +0 -0
  92. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +0 -0
  93. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +0 -0
  94. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/unit/__init__.py +0 -0
  95. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/unit/conftest.py +0 -0
  96. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +0 -0
  97. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +0 -0
  98. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/unit/test_model_products.py +0 -0
  99. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +0 -0
  100. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +0 -0
  101. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py +0 -0
  102. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +0 -0
  103. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/tests/unit/test_tools.py +0 -0
  104. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/model_evaluation/utils.py +0 -0
  105. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/output.py +0 -0
  106. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/plotting/__init__.py +0 -0
  107. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/plotting/plot_meta.py +0 -0
  108. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/plotting/plotting.py +0 -0
  109. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/products/__init__.py +0 -0
  110. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/products/classification.py +0 -0
  111. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/products/der.py +0 -0
  112. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/products/drizzle.py +0 -0
  113. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/products/drizzle_error.py +0 -0
  114. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/products/drizzle_tools.py +0 -0
  115. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/products/ier.py +0 -0
  116. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/products/iwc.py +0 -0
  117. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/products/lwc.py +0 -0
  118. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/products/mie_lu_tables.nc +0 -0
  119. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/products/mwr_tools.py +0 -0
  120. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/products/product_tools.py +0 -0
  121. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/py.typed +0 -0
  122. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy/utils.py +0 -0
  123. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy.egg-info/SOURCES.txt +0 -0
  124. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy.egg-info/dependency_links.txt +0 -0
  125. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy.egg-info/entry_points.txt +0 -0
  126. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy.egg-info/requires.txt +0 -0
  127. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/cloudnetpy.egg-info/top_level.txt +0 -0
  128. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/docs/source/conf.py +0 -0
  129. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/pyproject.toml +0 -0
  130. {cloudnetpy-1.68.0 → cloudnetpy-1.69.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: cloudnetpy
3
- Version: 1.68.0
3
+ Version: 1.69.0
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -164,11 +164,11 @@ def _calc_mean_height(model_heights: np.ndarray) -> np.ndarray:
164
164
 
165
165
  def _find_model_type(file_name: str) -> str:
166
166
  """Finds model type from the model filename."""
167
- possible_keys = ("gdas1", "icon", "ecmwf", "harmonie", "era5")
167
+ possible_keys = ("gdas1", "icon", "ecmwf", "harmonie", "era5", "arpege")
168
168
  for key in possible_keys:
169
169
  if key in file_name:
170
170
  return key
171
- msg = "Unknown model type"
171
+ msg = f"Unknown model type: {file_name}"
172
172
  raise ValueError(msg)
173
173
 
174
174
 
@@ -43,6 +43,8 @@ def rain_e_h32nc(
43
43
  rain.convert_units()
44
44
  rain.normalize_rainfall_amount()
45
45
  rain.add_site_geolocation()
46
+ rain.sort_timestamps()
47
+ rain.remove_duplicate_timestamps()
46
48
  attributes = output.add_time_attribute({}, rain.date)
47
49
  output.update_attributes(rain.data, attributes)
48
50
  return output.save_level1b(rain, output_file, uuid)
@@ -57,6 +57,8 @@ def ws2nc(
57
57
  ws = HyytialaWS(weather_station_file, site_meta)
58
58
  elif site_meta["name"] == "Galați":
59
59
  ws = GalatiWS(weather_station_file, site_meta)
60
+ elif site_meta["name"] == "Jülich":
61
+ ws = JuelichWS(weather_station_file, site_meta)
60
62
  else:
61
63
  msg = "Unsupported site"
62
64
  raise ValueError(msg) # noqa: TRY301
@@ -87,7 +89,7 @@ class WS(CSVFile):
87
89
  date: list[str]
88
90
 
89
91
  def calculate_rainfall_amount(self) -> None:
90
- if "rainfall_amount" in self.data:
92
+ if "rainfall_amount" in self.data or "rainfall_rate" not in self.data:
91
93
  return
92
94
  resolution = np.median(np.diff(self.data["time"].data)) * SEC_IN_HOUR
93
95
  rainfall_amount = ma.cumsum(self.data["rainfall_rate"].data * resolution)
@@ -116,6 +118,8 @@ class WS(CSVFile):
116
118
  self.data["relative_humidity"].data = self.data["relative_humidity"][:] / 100
117
119
 
118
120
  def convert_rainfall_rate(self) -> None:
121
+ if "rainfall_rate" not in self.data:
122
+ return
119
123
  rainfall_rate = self.data["rainfall_rate"][:]
120
124
  self.data["rainfall_rate"].data = rainfall_rate / 60 / 1000 # mm/min -> m/s
121
125
 
@@ -438,3 +442,47 @@ class GalatiWS(WS):
438
442
  def convert_pressure(self) -> None:
439
443
  mmHg2Pa = 133.322
440
444
  self.data["air_pressure"].data = self.data["air_pressure"][:] * mmHg2Pa
445
+
446
+
447
+ class JuelichWS(WS):
448
+ def __init__(self, filenames: list[str], site_meta: dict):
449
+ super().__init__(site_meta)
450
+ self.filename = filenames[0]
451
+ self._data = self._read_data()
452
+
453
+ def _read_data(self) -> dict:
454
+ keymap = {
455
+ "TIMESTAMP": "time",
456
+ "AirTC_Avg": "air_temperature",
457
+ "RH": "relative_humidity",
458
+ "BV_BP_Avg": "air_pressure",
459
+ "WS_ms_S_WVT": "wind_speed",
460
+ "WindDir_D1_WVT": "wind_direction",
461
+ }
462
+ expected_units = {
463
+ "AirTC_Avg": "Deg C",
464
+ "RH": "%",
465
+ "BV_BP_Avg": "hPa",
466
+ "WS_ms_S_WVT": "meters/Second",
467
+ "WindDir_D1_WVT": "Deg",
468
+ }
469
+ units, process, rows = read_toa5(self.filename)
470
+ for key in units:
471
+ if key in expected_units and expected_units[key] != units[key]:
472
+ msg = (
473
+ f"Expected {key} to have units {expected_units[key]},"
474
+ f" got {units[key]} instead"
475
+ )
476
+ raise ValueError(msg)
477
+
478
+ data: dict[str, list] = {keymap[key]: [] for key in units if key in keymap}
479
+ for row in rows:
480
+ for key, value in row.items():
481
+ if key not in keymap:
482
+ continue
483
+ parsed = value
484
+ if keymap[key] != "time":
485
+ parsed = float(value)
486
+ data[keymap[key]].append(parsed)
487
+
488
+ return self.format_data(data)
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
- MINOR = 68
2
+ MINOR = 69
3
3
  PATCH = 0
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: cloudnetpy
3
- Version: 1.68.0
3
+ Version: 1.69.0
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