cloudnetpy 1.76.1__tar.gz → 1.77.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 (132) hide show
  1. {cloudnetpy-1.76.1/cloudnetpy.egg-info → cloudnetpy-1.77.0}/PKG-INFO +1 -1
  2. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/__init__.py +1 -0
  3. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/cloudnet_instrument.py +16 -11
  4. cloudnetpy-1.77.0/cloudnetpy/instruments/fd12p.py +173 -0
  5. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/instruments.py +7 -0
  6. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/rain_e_h3.py +1 -1
  7. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/weather_station.py +1 -1
  8. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/plotting/plotting.py +3 -0
  9. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/version.py +2 -2
  10. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0/cloudnetpy.egg-info}/PKG-INFO +1 -1
  11. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy.egg-info/SOURCES.txt +1 -0
  12. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/LICENSE +0 -0
  13. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/MANIFEST.in +0 -0
  14. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/README.md +0 -0
  15. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/__init__.py +0 -0
  16. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/__init__.py +0 -0
  17. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/atmos_utils.py +0 -0
  18. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/attenuation.py +0 -0
  19. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/attenuations/__init__.py +0 -0
  20. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/attenuations/gas_attenuation.py +0 -0
  21. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/attenuations/liquid_attenuation.py +0 -0
  22. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/attenuations/melting_attenuation.py +0 -0
  23. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/attenuations/rain_attenuation.py +0 -0
  24. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/categorize.py +0 -0
  25. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/classify.py +0 -0
  26. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/containers.py +0 -0
  27. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/disdrometer.py +0 -0
  28. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/droplet.py +0 -0
  29. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/falling.py +0 -0
  30. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/freezing.py +0 -0
  31. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/insects.py +0 -0
  32. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/itu.py +0 -0
  33. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/lidar.py +0 -0
  34. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/melting.py +0 -0
  35. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/model.py +0 -0
  36. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/mwr.py +0 -0
  37. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/categorize/radar.py +0 -0
  38. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/cli.py +0 -0
  39. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/cloudnetarray.py +0 -0
  40. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/concat_lib.py +0 -0
  41. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/constants.py +0 -0
  42. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/datasource.py +0 -0
  43. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/exceptions.py +0 -0
  44. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/basta.py +0 -0
  45. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/bowtie.py +0 -0
  46. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/ceilo.py +0 -0
  47. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/ceilometer.py +0 -0
  48. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/cl61d.py +0 -0
  49. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/copernicus.py +0 -0
  50. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/disdrometer/__init__.py +0 -0
  51. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/disdrometer/common.py +0 -0
  52. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/disdrometer/parsivel.py +0 -0
  53. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/disdrometer/thies.py +0 -0
  54. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/galileo.py +0 -0
  55. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/hatpro.py +0 -0
  56. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/lufft.py +0 -0
  57. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/mira.py +0 -0
  58. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/mrr.py +0 -0
  59. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/nc_lidar.py +0 -0
  60. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/nc_radar.py +0 -0
  61. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/pollyxt.py +0 -0
  62. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/radiometrics.py +0 -0
  63. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/rpg.py +0 -0
  64. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/rpg_reader.py +0 -0
  65. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/toa5.py +0 -0
  66. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/instruments/vaisala.py +0 -0
  67. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/metadata.py +0 -0
  68. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/__init__.py +0 -0
  69. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/file_handler.py +0 -0
  70. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/metadata.py +0 -0
  71. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/model_metadata.py +0 -0
  72. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/plotting/__init__.py +0 -0
  73. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/plotting/plot_meta.py +0 -0
  74. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/plotting/plot_tools.py +0 -0
  75. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/plotting/plotting.py +0 -0
  76. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/products/__init__.py +0 -0
  77. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/products/advance_methods.py +0 -0
  78. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/products/grid_methods.py +0 -0
  79. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/products/model_products.py +0 -0
  80. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/products/observation_products.py +0 -0
  81. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/products/product_resampling.py +0 -0
  82. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/products/tools.py +0 -0
  83. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/statistics/__init__.py +0 -0
  84. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/statistics/statistical_methods.py +0 -0
  85. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/__init__.py +0 -0
  86. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/e2e/__init__.py +0 -0
  87. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/e2e/conftest.py +0 -0
  88. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/e2e/process_cf/__init__.py +0 -0
  89. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +0 -0
  90. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +0 -0
  91. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/__init__.py +0 -0
  92. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +0 -0
  93. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +0 -0
  94. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/__init__.py +0 -0
  95. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +0 -0
  96. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +0 -0
  97. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/unit/__init__.py +0 -0
  98. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/unit/conftest.py +0 -0
  99. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +0 -0
  100. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +0 -0
  101. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/unit/test_model_products.py +0 -0
  102. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +0 -0
  103. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +0 -0
  104. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py +0 -0
  105. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +0 -0
  106. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/tests/unit/test_tools.py +0 -0
  107. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/model_evaluation/utils.py +0 -0
  108. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/output.py +0 -0
  109. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/plotting/__init__.py +0 -0
  110. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/plotting/plot_meta.py +0 -0
  111. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/products/__init__.py +0 -0
  112. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/products/classification.py +0 -0
  113. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/products/der.py +0 -0
  114. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/products/drizzle.py +0 -0
  115. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/products/drizzle_error.py +0 -0
  116. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/products/drizzle_tools.py +0 -0
  117. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/products/epsilon.py +0 -0
  118. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/products/ier.py +0 -0
  119. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/products/iwc.py +0 -0
  120. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/products/lwc.py +0 -0
  121. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/products/mie_lu_tables.nc +0 -0
  122. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/products/mwr_tools.py +0 -0
  123. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/products/product_tools.py +0 -0
  124. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/py.typed +0 -0
  125. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy/utils.py +0 -0
  126. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy.egg-info/dependency_links.txt +0 -0
  127. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy.egg-info/entry_points.txt +0 -0
  128. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy.egg-info/requires.txt +0 -0
  129. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/cloudnetpy.egg-info/top_level.txt +0 -0
  130. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/docs/source/conf.py +0 -0
  131. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/pyproject.toml +0 -0
  132. {cloudnetpy-1.76.1 → cloudnetpy-1.77.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudnetpy
3
- Version: 1.76.1
3
+ Version: 1.77.0
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -3,6 +3,7 @@ from .bowtie import bowtie2nc
3
3
  from .ceilo import ceilo2nc
4
4
  from .copernicus import copernicus2nc
5
5
  from .disdrometer import parsivel2nc, thies2nc
6
+ from .fd12p import fd12p2nc
6
7
  from .galileo import galileo2nc
7
8
  from .hatpro import hatpro2l1c, hatpro2nc
8
9
  from .instruments import Instrument
@@ -109,17 +109,22 @@ class CSVFile(CloudnetInstrument):
109
109
  parsed = (
110
110
  utils.datetime2decimal_hours(value)
111
111
  if key == "time"
112
- else ma.array(value)
112
+ else ma.masked_invalid(value)
113
113
  )
114
114
  self.data[key] = CloudnetArray(parsed, key)
115
115
 
116
- def normalize_rainfall_amount(self) -> None:
117
- if "rainfall_amount" in self.data:
118
- amount = self.data["rainfall_amount"][:]
119
- offset = 0
120
- for i in range(1, len(amount)):
121
- if amount[i] + offset < amount[i - 1]:
122
- offset += amount[i - 1]
123
- amount[i] += offset
124
- amount -= amount[0]
125
- self.data["rainfall_amount"].data = amount
116
+ def normalize_cumulative_amount(self, key: str) -> None:
117
+ if key not in self.data:
118
+ return
119
+ amount = self.data[key][:]
120
+ offset = 0
121
+ last_valid = 0
122
+ for i in range(1, len(amount)):
123
+ if amount[i] is ma.masked:
124
+ continue
125
+ if amount[i] + offset < amount[last_valid]:
126
+ offset += amount[last_valid]
127
+ amount[i] += offset
128
+ last_valid = i
129
+ amount -= amount[0]
130
+ self.data[key].data = amount
@@ -0,0 +1,173 @@
1
+ import datetime
2
+ import math
3
+ from os import PathLike
4
+ from uuid import UUID
5
+
6
+ import numpy as np
7
+ from numpy import ma
8
+
9
+ from cloudnetpy import output
10
+ from cloudnetpy.exceptions import ValidTimeStampError
11
+ from cloudnetpy.instruments import instruments
12
+ from cloudnetpy.instruments.cloudnet_instrument import CSVFile
13
+ from cloudnetpy.metadata import MetaData
14
+
15
+
16
+ def fd12p2nc(
17
+ input_file: str | PathLike,
18
+ output_file: str | PathLike,
19
+ site_meta: dict,
20
+ uuid: str | UUID | None = None,
21
+ date: str | datetime.date | None = None,
22
+ ):
23
+ """Converts Vaisala FD12P into Cloudnet Level 1b netCDF file.
24
+
25
+ Args:
26
+ input_file: Filename of input file.
27
+ output_file: Output filename.
28
+ site_meta: Dictionary containing information about the site. Required key
29
+ is `name`.
30
+ uuid: Set specific UUID for the file.
31
+ date: Expected date of the measurements as YYYY-MM-DD or datetime.date object.
32
+
33
+ Returns:
34
+ UUID of the generated file.
35
+
36
+ Raises:
37
+ ValidTimeStampError: No valid timestamps found.
38
+ """
39
+ if isinstance(date, str):
40
+ date = datetime.date.fromisoformat(date)
41
+ if isinstance(uuid, str):
42
+ uuid = UUID(uuid)
43
+ fd12p = FD12P(site_meta)
44
+ fd12p.parse_input_file(input_file, date)
45
+ fd12p.add_data()
46
+ fd12p.add_date()
47
+ fd12p.screen_all_masked()
48
+ fd12p.sort_timestamps()
49
+ fd12p.remove_duplicate_timestamps()
50
+ fd12p.convert_units()
51
+ fd12p.normalize_cumulative_amount("precipitation_amount")
52
+ fd12p.normalize_cumulative_amount("snowfall_amount")
53
+ fd12p.add_site_geolocation()
54
+ attributes = output.add_time_attribute(ATTRIBUTES, fd12p.date)
55
+ output.update_attributes(fd12p.data, attributes)
56
+ return output.save_level1b(fd12p, output_file, uuid)
57
+
58
+
59
+ class FD12P(CSVFile):
60
+ def __init__(self, site_meta: dict):
61
+ super().__init__(site_meta)
62
+ self.instrument = instruments.FD12P
63
+ self._data = {
64
+ key: []
65
+ for key in (
66
+ "time",
67
+ "visibility",
68
+ "synop_WaWa",
69
+ "precipitation_rate",
70
+ "precipitation_amount",
71
+ "snowfall_amount",
72
+ )
73
+ }
74
+
75
+ def parse_input_file(
76
+ self, filename: str | PathLike, expected_date: datetime.date | None = None
77
+ ):
78
+ # In Lindenberg, format is date and time followed by Message 2 without
79
+ # non-printable characters.
80
+ with open(filename) as file:
81
+ for line in file:
82
+ columns = line.split()
83
+ date = _parse_date(columns[0])
84
+ time = _parse_time(columns[1])
85
+ self._data["time"].append(datetime.datetime.combine(date, time))
86
+ self._data["visibility"].append(_parse_int(columns[4]))
87
+ self._data["synop_WaWa"].append(_parse_int(columns[7]))
88
+ self._data["precipitation_rate"].append(
89
+ _parse_float(columns[10])
90
+ ) # mm/h
91
+ self._data["precipitation_amount"].append(
92
+ _parse_float(columns[11])
93
+ ) # mm
94
+ self._data["snowfall_amount"].append(_parse_int(columns[12])) # mm
95
+ for key in ("visibility", "synop_WaWa", "snowfall_amount"):
96
+ values = np.array(
97
+ [0 if x is math.nan else x for x in self._data[key]], dtype=np.int32
98
+ )
99
+ mask = np.array([x is math.nan for x in self._data[key]])
100
+ self._data[key] = ma.array(values, mask=mask)
101
+ self._data["snowfall_amount"] = self._data["snowfall_amount"].astype(np.float32)
102
+ if expected_date:
103
+ self._data["time"] = [
104
+ d for d in self._data["time"] if d.date() == expected_date
105
+ ]
106
+ if not self._data["time"]:
107
+ raise ValidTimeStampError
108
+
109
+ def convert_units(self) -> None:
110
+ precipitation_rate = self.data["precipitation_rate"][:]
111
+ self.data["precipitation_rate"].data = (
112
+ precipitation_rate / 3600 / 1000
113
+ ) # mm/h -> m/s
114
+ for key in ("precipitation_amount", "snowfall_amount"):
115
+ self.data[key].data = self.data[key][:] / 1000 # mm -> m
116
+
117
+ def screen_all_masked(self) -> None:
118
+ is_valid = np.ones_like(self.data["time"][:], dtype=np.bool)
119
+ for key in self.data:
120
+ if key == "time":
121
+ continue
122
+ is_valid &= ma.getmaskarray(self.data[key][:])
123
+ self.screen_time_indices(~is_valid)
124
+
125
+
126
+ def _parse_date(date: str) -> datetime.date:
127
+ day, month, year = map(int, date.split("."))
128
+ return datetime.date(year, month, day)
129
+
130
+
131
+ def _parse_time(time: str) -> datetime.time:
132
+ hour, minute, *rest = [int(x) for x in time.split(":")]
133
+ second = rest[0] if rest else 0
134
+ return datetime.time(hour, minute, second)
135
+
136
+
137
+ def _parse_int(value: str) -> float:
138
+ if "/" in value:
139
+ return math.nan
140
+ return int(value)
141
+
142
+
143
+ def _parse_float(value: str) -> float:
144
+ if "/" in value:
145
+ return math.nan
146
+ return float(value)
147
+
148
+
149
+ ATTRIBUTES = {
150
+ "visibility": MetaData(
151
+ long_name="Meteorological optical range (MOR) visibility",
152
+ units="m",
153
+ standard_name="visibility_in_air",
154
+ ),
155
+ "precipitation_rate": MetaData(
156
+ long_name="Precipitation rate",
157
+ standard_name="lwe_precipitation_rate",
158
+ units="m s-1",
159
+ ),
160
+ "precipitation_amount": MetaData(
161
+ long_name="Precipitation amount",
162
+ standard_name="lwe_thickness_of_precipitation_amount",
163
+ units="m",
164
+ comment="Cumulated precipitation since 00:00 UTC",
165
+ ),
166
+ "snowfall_amount": MetaData(
167
+ long_name="Snowfall amount",
168
+ units="m",
169
+ standard_name="thickness_of_snowfall_amount",
170
+ comment="Cumulated snow since 00:00 UTC",
171
+ ),
172
+ "synop_WaWa": MetaData(long_name="Synop code WaWa", units="1"),
173
+ }
@@ -246,3 +246,10 @@ MRR_PRO = Instrument(
246
246
  model="MRR-PRO",
247
247
  frequency=24.23,
248
248
  )
249
+
250
+ FD12P = Instrument(
251
+ manufacturer="Vaisala",
252
+ domain="weather-station",
253
+ category="present weather sensor",
254
+ model="FD12P",
255
+ )
@@ -40,7 +40,7 @@ def rain_e_h32nc(
40
40
  rain.add_data()
41
41
  rain.add_date()
42
42
  rain.convert_units()
43
- rain.normalize_rainfall_amount()
43
+ rain.normalize_cumulative_amount("rainfall_amount")
44
44
  rain.add_site_geolocation()
45
45
  rain.sort_timestamps()
46
46
  rain.remove_duplicate_timestamps()
@@ -77,7 +77,7 @@ def ws2nc(
77
77
  ws.convert_pressure()
78
78
  ws.convert_rainfall_rate()
79
79
  ws.convert_rainfall_amount()
80
- ws.normalize_rainfall_amount()
80
+ ws.normalize_cumulative_amount("rainfall_amount")
81
81
  ws.calculate_rainfall_amount()
82
82
  attributes = output.add_time_attribute({}, ws.date)
83
83
  output.update_attributes(ws.data, attributes)
@@ -361,9 +361,12 @@ class Plot:
361
361
  units_conversion = {
362
362
  "rainfall_rate": (multiply, 3600000, "mm h$^{-1}$"),
363
363
  "snowfall_rate": (multiply, 3600000, "mm h$^{-1}$"),
364
+ "precipitation_rate": (multiply, 3600000, "mm h$^{-1}$"),
364
365
  "air_pressure": (multiply, 0.01, "hPa"),
365
366
  "relative_humidity": (multiply, 100, "%"),
366
367
  "rainfall_amount": (multiply, 1000, "mm"),
368
+ "snowfall_amount": (multiply, 1000, "mm"),
369
+ "precipitation_amount": (multiply, 1000, "mm"),
367
370
  "air_temperature": (add, -273.15, "\u00b0C"),
368
371
  "r_accum_RT": (multiply, 1000, "mm"),
369
372
  "r_accum_NRT": (multiply, 1000, "mm"),
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
- MINOR = 76
3
- PATCH = 1
2
+ MINOR = 77
3
+ PATCH = 0
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudnetpy
3
- Version: 1.76.1
3
+ Version: 1.77.0
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -50,6 +50,7 @@ cloudnetpy/instruments/ceilometer.py
50
50
  cloudnetpy/instruments/cl61d.py
51
51
  cloudnetpy/instruments/cloudnet_instrument.py
52
52
  cloudnetpy/instruments/copernicus.py
53
+ cloudnetpy/instruments/fd12p.py
53
54
  cloudnetpy/instruments/galileo.py
54
55
  cloudnetpy/instruments/hatpro.py
55
56
  cloudnetpy/instruments/instruments.py
File without changes
File without changes
File without changes
File without changes
File without changes