disdrodb 0.2.0__py3-none-any.whl → 0.2.1__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.
Files changed (71) hide show
  1. disdrodb/_version.py +2 -2
  2. disdrodb/accessor/methods.py +10 -3
  3. disdrodb/api/checks.py +1 -1
  4. disdrodb/api/io.py +6 -1
  5. disdrodb/constants.py +1 -1
  6. disdrodb/etc/products/L1/LPM_V0/1MIN.yaml +13 -0
  7. disdrodb/etc/products/L1/global.yaml +1 -1
  8. disdrodb/etc/products/L2E/global.yaml +1 -1
  9. disdrodb/etc/products/L2M/global.yaml +1 -1
  10. disdrodb/issue/checks.py +2 -2
  11. disdrodb/l0/check_configs.py +1 -1
  12. disdrodb/l0/configs/LPM/l0a_encodings.yml +0 -1
  13. disdrodb/l0/configs/LPM/l0b_cf_attrs.yml +0 -4
  14. disdrodb/l0/configs/LPM/l0b_encodings.yml +9 -9
  15. disdrodb/l0/configs/LPM/raw_data_format.yml +11 -11
  16. disdrodb/l0/configs/LPM_V0/bins_diameter.yml +103 -0
  17. disdrodb/l0/configs/LPM_V0/bins_velocity.yml +103 -0
  18. disdrodb/l0/configs/LPM_V0/l0a_encodings.yml +45 -0
  19. disdrodb/l0/configs/LPM_V0/l0b_cf_attrs.yml +180 -0
  20. disdrodb/l0/configs/LPM_V0/l0b_encodings.yml +410 -0
  21. disdrodb/l0/configs/LPM_V0/raw_data_format.yml +474 -0
  22. disdrodb/l0/configs/PARSIVEL/raw_data_format.yml +8 -8
  23. disdrodb/l0/configs/PARSIVEL2/raw_data_format.yml +9 -9
  24. disdrodb/l0/l0a_processing.py +6 -2
  25. disdrodb/l0/l0b_processing.py +26 -19
  26. disdrodb/l0/l0c_processing.py +10 -0
  27. disdrodb/l0/manuals/LPM_V0.pdf +0 -0
  28. disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +15 -7
  29. disdrodb/l0/readers/LPM/ITALY/GID_LPM_PI.py +279 -0
  30. disdrodb/l0/readers/LPM/ITALY/GID_LPM_T.py +276 -0
  31. disdrodb/l0/readers/LPM/ITALY/GID_LPM_W.py +2 -2
  32. disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_RWANDA_LPM_NC.py +103 -0
  33. disdrodb/l0/readers/LPM/NORWAY/HAUKELISETER_LPM.py +216 -0
  34. disdrodb/l0/readers/LPM/NORWAY/NMBU_LPM.py +208 -0
  35. disdrodb/l0/readers/LPM/UK/WITHWORTH_LPM.py +219 -0
  36. disdrodb/l0/readers/LPM/USA/CHARLESTON.py +229 -0
  37. disdrodb/l0/readers/{LPM → LPM_V0}/BELGIUM/ULIEGE.py +33 -49
  38. disdrodb/l0/readers/LPM_V0/ITALY/GID_LPM_V0.py +240 -0
  39. disdrodb/l0/readers/PARSIVEL/NASA/LPVEX.py +25 -13
  40. disdrodb/l0/readers/PARSIVEL/NASA/MC3E.py +1 -1
  41. disdrodb/l0/readers/PARSIVEL2/BASQUECOUNTRY/EUSKALMET_OTT2.py +1 -1
  42. disdrodb/l0/readers/PARSIVEL2/JAPAN/PRECIP.py +155 -0
  43. disdrodb/l0/readers/PARSIVEL2/MPI/BCO_PARSIVEL2.py +14 -7
  44. disdrodb/l0/readers/PARSIVEL2/MPI/BOWTIE.py +8 -3
  45. disdrodb/l0/readers/PARSIVEL2/NASA/APU.py +28 -5
  46. disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +1 -1
  47. disdrodb/l0/readers/PARSIVEL2/{NASA/GCPEX.py → NORWAY/UIB.py} +54 -29
  48. disdrodb/l0/readers/PARSIVEL2/PHILIPPINES/PAGASA.py +6 -3
  49. disdrodb/l0/readers/{PARSIVEL/NASA/PIERS.py → PARSIVEL2/USA/CSU.py} +62 -29
  50. disdrodb/l0/readers/PARSIVEL2/USA/CW3E.py +48 -21
  51. disdrodb/l0/readers/{PARSIVEL/NASA/IFLOODS.py → RD80/BRAZIL/ATTO_RD80.py} +50 -34
  52. disdrodb/l0/readers/{SW250 → SWS250}/BELGIUM/KMI.py +1 -1
  53. disdrodb/l1/beard_model.py +45 -1
  54. disdrodb/l1/fall_velocity.py +1 -6
  55. disdrodb/l1/filters.py +2 -0
  56. disdrodb/l2/empirical_dsd.py +12 -8
  57. disdrodb/routines/l0.py +2 -2
  58. disdrodb/routines/options.py +2 -0
  59. disdrodb/scattering/axis_ratio.py +3 -0
  60. disdrodb/scattering/routines.py +1 -1
  61. disdrodb/summary/routines.py +63 -61
  62. disdrodb/utils/compression.py +4 -2
  63. disdrodb/utils/dask.py +31 -11
  64. disdrodb/utils/manipulations.py +7 -1
  65. disdrodb/viz/plots.py +5 -3
  66. {disdrodb-0.2.0.dist-info → disdrodb-0.2.1.dist-info}/METADATA +1 -1
  67. {disdrodb-0.2.0.dist-info → disdrodb-0.2.1.dist-info}/RECORD +71 -54
  68. {disdrodb-0.2.0.dist-info → disdrodb-0.2.1.dist-info}/WHEEL +0 -0
  69. {disdrodb-0.2.0.dist-info → disdrodb-0.2.1.dist-info}/entry_points.txt +0 -0
  70. {disdrodb-0.2.0.dist-info → disdrodb-0.2.1.dist-info}/licenses/LICENSE +0 -0
  71. {disdrodb-0.2.0.dist-info → disdrodb-0.2.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,474 @@
1
+ start_identifier:
2
+ n_digits: 1
3
+ n_characters: 1
4
+ n_decimals: 0
5
+ n_naturals: 1
6
+ data_range:
7
+ - 0
8
+ - 9
9
+ nan_flags: null
10
+ field_number: "01"
11
+ sensor_serial_number:
12
+ n_digits: 6
13
+ n_characters: 6
14
+ n_decimals: 0
15
+ n_naturals: 6
16
+ data_range:
17
+ - 0
18
+ - 999999
19
+ nan_flags: null
20
+ field_number: "02"
21
+ weather_code_synop_4680_5min:
22
+ n_digits: 2
23
+ n_characters: 2
24
+ n_decimals: 0
25
+ n_naturals: 2
26
+ data_range:
27
+ - -1
28
+ - 89
29
+ nan_flags: -1
30
+ field_number: "03"
31
+ weather_code_metar_4678_5min:
32
+ n_digits: 0
33
+ n_characters: 5
34
+ n_decimals: 0
35
+ n_naturals: 0
36
+ data_range: null
37
+ nan_flags: "?????"
38
+ field_number: "04"
39
+ precipitation_rate_5min:
40
+ n_digits: 6
41
+ n_characters: 7
42
+ n_decimals: 3
43
+ n_naturals: 3
44
+ data_range:
45
+ - 0.0
46
+ - 999.999
47
+ nan_flags: 999.999
48
+ field_number: "05"
49
+ weather_code_synop_4680:
50
+ n_digits: 0
51
+ n_characters: 5
52
+ n_decimals: 0
53
+ n_naturals: 0
54
+ data_range:
55
+ - -1
56
+ - 89
57
+ nan_flags: -1
58
+ field_number: "06"
59
+ weather_code_metar_4678:
60
+ n_digits: 0
61
+ n_characters: 5
62
+ n_decimals: 0
63
+ n_naturals: 0
64
+ data_range: null
65
+ nan_flags: "?????"
66
+ field_number: "07"
67
+ precipitation_rate:
68
+ n_digits: 6
69
+ n_characters: 7
70
+ n_decimals: 3
71
+ n_naturals: 3
72
+ data_range:
73
+ - 0.0
74
+ - 999.999
75
+ nan_flags: 999.999
76
+ field_number: "08"
77
+ precipitation_accumulated:
78
+ n_digits: 6
79
+ n_characters: 7
80
+ n_decimals: 4
81
+ n_naturals: 2
82
+ data_range:
83
+ - 0.0
84
+ - 9999.99
85
+ nan_flags: 9999.99
86
+ field_number: "09"
87
+ sensor_time:
88
+ n_digits: 6
89
+ n_characters: 8
90
+ n_decimals: 6
91
+ n_naturals: 0
92
+ data_range: null
93
+ nan_flags: null
94
+ field_number: "10"
95
+ temperature_interior:
96
+ n_digits: 3
97
+ n_characters: 3
98
+ n_decimals: 3
99
+ n_naturals: 0
100
+ data_range:
101
+ - -30
102
+ - 999
103
+ nan_flags: null
104
+ field_number: "11"
105
+ laser_temperature:
106
+ n_digits: 2
107
+ n_characters: 2
108
+ n_decimals: 2
109
+ n_naturals: 0
110
+ data_range:
111
+ - 0
112
+ - 80
113
+ nan_flags: null
114
+ field_number: "12"
115
+ laser_current_average:
116
+ n_digits: 4
117
+ n_characters: 4
118
+ n_decimals: 4
119
+ n_naturals: 0
120
+ data_range:
121
+ - 0
122
+ - 9999
123
+ nan_flags: null
124
+ field_number: "13"
125
+ control_voltage:
126
+ n_digits: 4
127
+ n_characters: 4
128
+ n_decimals: 4
129
+ n_naturals: 0
130
+ data_range: null
131
+ nan_flags: null
132
+ field_number: "14"
133
+ optical_control_voltage_output:
134
+ n_digits: 4
135
+ n_characters: 4
136
+ n_decimals: 4
137
+ n_naturals: 0
138
+ data_range:
139
+ - 0
140
+ - 9999
141
+ nan_flags: null
142
+ field_number: "15"
143
+ number_particles:
144
+ n_digits: 5
145
+ n_characters: 5
146
+ n_decimals: 5
147
+ n_naturals: 0
148
+ data_range:
149
+ - 0
150
+ - 99999
151
+ nan_flags: null
152
+ field_number: "16"
153
+ number_particles_internal_data:
154
+ n_digits: 8
155
+ n_characters: 9
156
+ n_decimals: 5
157
+ n_naturals: 3
158
+ data_range:
159
+ - 0.0
160
+ - 99999.999
161
+ nan_flags: null
162
+ field_number: "17"
163
+ number_particles_min_speed:
164
+ n_digits: 5
165
+ n_characters: 5
166
+ n_decimals: 5
167
+ n_naturals: 0
168
+ data_range:
169
+ - 0
170
+ - 99999
171
+ nan_flags: null
172
+ field_number: "18"
173
+ number_particles_min_speed_internal_data:
174
+ n_digits: 8
175
+ n_characters: 9
176
+ n_decimals: 5
177
+ n_naturals: 3
178
+ data_range:
179
+ - 0.0
180
+ - 99999.999
181
+ nan_flags: null
182
+ field_number: "19"
183
+ number_particles_max_speed:
184
+ n_digits: 5
185
+ n_characters: 5
186
+ n_decimals: 5
187
+ n_naturals: 0
188
+ data_range:
189
+ - 0
190
+ - 99999
191
+ nan_flags: null
192
+ field_number: "20"
193
+ number_particles_max_speed_internal_data:
194
+ n_digits: 8
195
+ n_characters: 9
196
+ n_decimals: 5
197
+ n_naturals: 3
198
+ data_range:
199
+ - 0.0
200
+ - 99999.999
201
+ nan_flags: null
202
+ field_number: "21"
203
+ number_particles_min_diameter:
204
+ n_digits: 5
205
+ n_characters: 5
206
+ n_decimals: 5
207
+ n_naturals: 0
208
+ data_range:
209
+ - 0
210
+ - 99999
211
+ nan_flags: null
212
+ field_number: "22"
213
+ number_particles_min_diameter_internal_data:
214
+ n_digits: 8
215
+ n_characters: 9
216
+ n_decimals: 5
217
+ n_naturals: 3
218
+ data_range:
219
+ - 0.0
220
+ - 99999.999
221
+ nan_flags: null
222
+ field_number: "23"
223
+ number_particles_no_hydrometeor:
224
+ n_digits: 5
225
+ n_characters: 5
226
+ n_decimals: 5
227
+ n_naturals: 0
228
+ data_range:
229
+ - 0
230
+ - 99999
231
+ nan_flags: null
232
+ field_number: "24"
233
+ number_particles_no_hydrometeor_internal_data:
234
+ n_digits: 8
235
+ n_characters: 9
236
+ n_decimals: 5
237
+ n_naturals: 3
238
+ data_range:
239
+ - 0.0
240
+ - 99999.999
241
+ nan_flags: null
242
+ field_number: "25"
243
+ number_particles_unknown_classification:
244
+ n_digits: 5
245
+ n_characters: 5
246
+ n_decimals: 5
247
+ n_naturals: 0
248
+ data_range:
249
+ - 0
250
+ - 99999
251
+ nan_flags: null
252
+ field_number: "26"
253
+ total_gross_volume_unknown_classification:
254
+ n_digits: 8
255
+ n_characters: 9
256
+ n_decimals: 5
257
+ n_naturals: 3
258
+ data_range:
259
+ - 0.0
260
+ - 99999.999
261
+ nan_flags: null
262
+ field_number: "27"
263
+ number_particles_hail:
264
+ n_digits: 5
265
+ n_characters: 5
266
+ n_decimals: 5
267
+ n_naturals: 0
268
+ data_range:
269
+ - 0
270
+ - 99999
271
+ nan_flags: null
272
+ field_number: "28"
273
+ total_gross_volume_hail:
274
+ n_digits: 8
275
+ n_characters: 9
276
+ n_decimals: 5
277
+ n_naturals: 3
278
+ data_range:
279
+ - 0.0
280
+ - 99999.999
281
+ nan_flags: null
282
+ field_number: "29"
283
+ number_particles_solid_precipitation:
284
+ n_digits: 5
285
+ n_characters: 5
286
+ n_decimals: 5
287
+ n_naturals: 0
288
+ data_range:
289
+ - 0
290
+ - 99999
291
+ nan_flags: null
292
+ field_number: "30"
293
+ total_gross_volume_solid_precipitation:
294
+ n_digits: 8
295
+ n_characters: 9
296
+ n_decimals: 5
297
+ n_naturals: 3
298
+ data_range:
299
+ - 0.0
300
+ - 99999.999
301
+ nan_flags: null
302
+ field_number: "31"
303
+ number_particles_great_pellet:
304
+ n_digits: 5
305
+ n_characters: 5
306
+ n_decimals: 5
307
+ n_naturals: 0
308
+ data_range:
309
+ - 0
310
+ - 99999
311
+ nan_flags: null
312
+ field_number: "32"
313
+ total_gross_volume_great_pellet:
314
+ n_digits: 8
315
+ n_characters: 9
316
+ n_decimals: 5
317
+ n_naturals: 3
318
+ data_range:
319
+ - 0.0
320
+ - 99999.999
321
+ nan_flags: null
322
+ field_number: "33"
323
+ number_particles_small_pellet:
324
+ n_digits: 5
325
+ n_characters: 5
326
+ n_decimals: 5
327
+ n_naturals: 0
328
+ data_range:
329
+ - 0
330
+ - 99999
331
+ nan_flags: null
332
+ field_number: "34"
333
+ total_gross_volume_small_pellet:
334
+ n_digits: 8
335
+ n_characters: 9
336
+ n_decimals: 5
337
+ n_naturals: 3
338
+ data_range:
339
+ - 0.0
340
+ - 99999.999
341
+ nan_flags: null
342
+ field_number: "35"
343
+ number_particles_snowgrain:
344
+ n_digits: 5
345
+ n_characters: 5
346
+ n_decimals: 5
347
+ n_naturals: 0
348
+ data_range:
349
+ - 0
350
+ - 99999
351
+ nan_flags: null
352
+ field_number: "36"
353
+ total_gross_volume_snowgrain:
354
+ n_digits: 8
355
+ n_characters: 9
356
+ n_decimals: 5
357
+ n_naturals: 3
358
+ data_range:
359
+ - 0.0
360
+ - 99999.999
361
+ nan_flags: null
362
+ field_number: "37"
363
+ number_particles_rain:
364
+ n_digits: 5
365
+ n_characters: 5
366
+ n_decimals: 5
367
+ n_naturals: 0
368
+ data_range:
369
+ - 0
370
+ - 99999
371
+ nan_flags: null
372
+ field_number: "38"
373
+ total_gross_volume_rain:
374
+ n_digits: 8
375
+ n_characters: 9
376
+ n_decimals: 5
377
+ n_naturals: 3
378
+ data_range:
379
+ - 0.0
380
+ - 99999.999
381
+ nan_flags: null
382
+ field_number: "39"
383
+ number_particles_small_rain:
384
+ n_digits: 5
385
+ n_characters: 5
386
+ n_decimals: 5
387
+ n_naturals: 0
388
+ data_range:
389
+ - 0
390
+ - 99999
391
+ nan_flags: null
392
+ field_number: "40"
393
+ total_gross_volume_small_rain:
394
+ n_digits: 8
395
+ n_characters: 9
396
+ n_decimals: 5
397
+ n_naturals: 3
398
+ data_range:
399
+ - 0.0
400
+ - 99999.999
401
+ nan_flags: null
402
+ field_number: "41"
403
+ number_particles_drizzle:
404
+ n_digits: 5
405
+ n_characters: 5
406
+ n_decimals: 5
407
+ n_naturals: 0
408
+ data_range:
409
+ - 0
410
+ - 99999
411
+ nan_flags: null
412
+ field_number: "42"
413
+ total_gross_volume_drizzle:
414
+ n_digits: 8
415
+ n_characters: 9
416
+ n_decimals: 5
417
+ n_naturals: 3
418
+ data_range:
419
+ - 0.0
420
+ - 99999.999
421
+ nan_flags: null
422
+ field_number: "43"
423
+ raw_drop_number:
424
+ n_digits: 1317
425
+ n_characters: 1756
426
+ n_decimals: 1317
427
+ n_naturals: 0
428
+ data_range: null
429
+ nan_flags: null
430
+ dimension_order:
431
+ - diameter_bin_center
432
+ - velocity_bin_center
433
+ n_values: 400
434
+ field_number: "81"
435
+ air_temperature:
436
+ n_digits: 4
437
+ n_characters: 5
438
+ n_decimals: 1
439
+ n_naturals: 2
440
+ data_range:
441
+ - -40
442
+ - 70
443
+ nan_flags: 99999
444
+ field_number: "444"
445
+ relative_humidity:
446
+ n_digits: 5
447
+ n_characters: 5
448
+ n_decimals: 0
449
+ n_naturals: 5
450
+ data_range:
451
+ - 0
452
+ - 99999
453
+ nan_flags: 99999
454
+ field_number: "445"
455
+ wind_speed:
456
+ n_digits: 3
457
+ n_characters: 4
458
+ n_decimals: 1
459
+ n_naturals: 2
460
+ data_range:
461
+ - 0
462
+ - 60
463
+ nan_flags: null
464
+ field_number: "446"
465
+ wind_direction:
466
+ n_digits: 3
467
+ n_characters: 3
468
+ n_decimals: 0
469
+ n_naturals: 3
470
+ data_range:
471
+ - 0
472
+ - 360
473
+ nan_flags: 999
474
+ field_number: "447"
@@ -6,7 +6,7 @@ rainfall_rate_32bit:
6
6
  data_range:
7
7
  - 0
8
8
  - 9999.999
9
- nan_flags: null
9
+ nan_flags: 9999.999
10
10
  field_number: "01"
11
11
  rainfall_accumulated_32bit:
12
12
  n_digits: 6
@@ -16,7 +16,7 @@ rainfall_accumulated_32bit:
16
16
  data_range:
17
17
  - 0
18
18
  - 9999.0
19
- nan_flags: null
19
+ nan_flags: 9999.0
20
20
  field_number: "02"
21
21
  weather_code_synop_4680:
22
22
  n_digits: 2
@@ -62,7 +62,7 @@ reflectivity_32bit:
62
62
  data_range:
63
63
  - -9.999
64
64
  - 99.999
65
- nan_flags: null
65
+ nan_flags: 99.999
66
66
  field_number: "07"
67
67
  mor_visibility:
68
68
  n_digits: 4
@@ -92,7 +92,7 @@ laser_amplitude:
92
92
  data_range:
93
93
  - 0
94
94
  - 99999
95
- nan_flags: null
95
+ nan_flags: 99999
96
96
  field_number: "10"
97
97
  number_particles:
98
98
  n_digits: 5
@@ -102,7 +102,7 @@ number_particles:
102
102
  data_range:
103
103
  - 0
104
104
  - 99999
105
- nan_flags: null
105
+ nan_flags: 99999
106
106
  field_number: "11"
107
107
  sensor_temperature:
108
108
  n_digits: 3
@@ -221,7 +221,7 @@ rainfall_amount_absolute_32bit:
221
221
  data_range:
222
222
  - 0
223
223
  - 999.999
224
- nan_flags: null
224
+ nan_flags: 999.999
225
225
  field_number: "24"
226
226
  error_code:
227
227
  n_digits: 3
@@ -245,7 +245,7 @@ rainfall_rate_16bit:
245
245
  data_range:
246
246
  - 0
247
247
  - 9999.999
248
- nan_flags: null
248
+ nan_flags: 9999.999
249
249
  field_number: "30"
250
250
  rainfall_rate_12bit:
251
251
  n_digits: 5
@@ -273,7 +273,7 @@ reflectivity_16bit:
273
273
  data_range:
274
274
  - -9.99
275
275
  - 99.99
276
- nan_flags: null
276
+ nan_flags: 99.99
277
277
  field_number: "33"
278
278
  raw_drop_concentration:
279
279
  n_digits: 0
@@ -6,7 +6,7 @@ rainfall_rate_32bit:
6
6
  data_range:
7
7
  - 0
8
8
  - 9999.999
9
- nan_flags: null
9
+ nan_flags: 9999.999
10
10
  field_number: "01"
11
11
  rainfall_accumulated_32bit:
12
12
  n_digits: 6
@@ -16,7 +16,7 @@ rainfall_accumulated_32bit:
16
16
  data_range:
17
17
  - 0
18
18
  - 9999.0
19
- nan_flags: null
19
+ nan_flags: 9999.0
20
20
  field_number: "02"
21
21
  weather_code_synop_4680:
22
22
  n_digits: 2
@@ -62,7 +62,7 @@ reflectivity_32bit:
62
62
  data_range:
63
63
  - -9.999
64
64
  - 99.999
65
- nan_flags: null
65
+ nan_flags: 99.999
66
66
  field_number: "07"
67
67
  mor_visibility:
68
68
  n_digits: 5
@@ -92,7 +92,7 @@ laser_amplitude:
92
92
  data_range:
93
93
  - 0
94
94
  - 99999
95
- nan_flags: null
95
+ nan_flags: 99999
96
96
  field_number: "10"
97
97
  number_particles:
98
98
  n_digits: 5
@@ -102,7 +102,7 @@ number_particles:
102
102
  data_range:
103
103
  - 0
104
104
  - 99999
105
- nan_flags: null
105
+ nan_flags: 99999
106
106
  field_number: "11"
107
107
  sensor_temperature:
108
108
  n_digits: 3
@@ -221,7 +221,7 @@ rainfall_amount_absolute_32bit:
221
221
  data_range:
222
222
  - 0
223
223
  - 999.999
224
- nan_flags: null
224
+ nan_flags: 999.999
225
225
  field_number: "24"
226
226
  error_code:
227
227
  n_digits: 3
@@ -305,7 +305,7 @@ reflectivity_16bit:
305
305
  data_range:
306
306
  - -9.99
307
307
  - 99.99
308
- nan_flags: null
308
+ nan_flags: 99.99
309
309
  field_number: "33"
310
310
  rain_kinetic_energy:
311
311
  n_digits: 6
@@ -315,7 +315,7 @@ rain_kinetic_energy:
315
315
  data_range:
316
316
  - 0
317
317
  - 9999.99
318
- nan_flags: null
318
+ nan_flags: 9999.99
319
319
  field_number: "34"
320
320
  snowfall_rate:
321
321
  n_digits: 6
@@ -325,7 +325,7 @@ snowfall_rate:
325
325
  data_range:
326
326
  - 0
327
327
  - 999.999
328
- nan_flags: null
328
+ nan_flags: 999.999
329
329
  field_number: "35"
330
330
  number_particles_all:
331
331
  n_digits: 8
@@ -267,8 +267,8 @@ def remove_issue_timesteps(df, issue_dict, logger=None, verbose=False):
267
267
  n_initial_rows = len(df)
268
268
 
269
269
  # Retrieve timesteps and time_periods
270
- timesteps = issue_dict.get("timesteps", None)
271
- time_periods = issue_dict.get("time_periods", None)
270
+ timesteps = issue_dict.get("timesteps")
271
+ time_periods = issue_dict.get("time_periods")
272
272
  timesteps = [] if timesteps is None else timesteps
273
273
  time_periods = [] if time_periods is None else time_periods
274
274
 
@@ -615,6 +615,10 @@ def sanitize_df(
615
615
  # - Strip first and last delimiter from the raw arrays
616
616
  df = strip_delimiter_from_raw_arrays(df)
617
617
 
618
+ # - Ensure raw drop number variable max value is < 999
619
+ # - Raise error otherwise
620
+ # TODO:
621
+
618
622
  # - Remove corrupted rows
619
623
  df = remove_corrupted_rows(df)
620
624
 
@@ -91,7 +91,7 @@ def format_string_array(string: str, n_values: int) -> np.array:
91
91
 
92
92
  e.g. : format_string_array("2,44,22,33", 4) will return [ 2. 44. 22. 33.]
93
93
 
94
- If empty string ("") --> Return an arrays of zeros
94
+ If empty string ("") or "" --> Return an arrays of zeros
95
95
  If the list length is not n_values -> Return an arrays of np.nan
96
96
 
97
97
  The function strip potential delimiters at start and end before splitting.
@@ -108,31 +108,38 @@ def format_string_array(string: str, n_values: int) -> np.array:
108
108
  np.array
109
109
  array of float
110
110
  """
111
- split_str = infer_split_str(string)
112
- values = np.array(string.strip(split_str).split(split_str))
113
-
114
- # -------------------------------------------------------------------------.
115
- ## Assumptions !!!
116
- # If empty list --> Assume no precipitation recorded. Return an arrays of zeros
117
- if len(values) == 0:
111
+ # Check for empty string or "0" case
112
+ # - Assume no precipitation recorded. Return an arrays of zeros
113
+ if string in {"", "0"}:
118
114
  values = np.zeros(n_values)
119
115
  return values
120
116
 
121
- # -------------------------------------------------------------------------.
117
+ # Check for NaN case
118
+ # - Assume no data available. Return an arrays of NaN
119
+ if string == "NaN":
120
+ values = np.zeros(n_values) * np.nan
121
+ return values
122
+
123
+ # Retrieve list of values
124
+ split_str = infer_split_str(string)
125
+ values = np.array(string.strip(split_str).split(split_str))
126
+
122
127
  # If the length is not as expected --> Assume data corruption
123
128
  # --> Return an array with nan
124
129
  if len(values) != n_values:
125
130
  values = np.zeros(n_values) * np.nan
126
- else:
127
- # Ensure string type
128
- values = values.astype("str")
129
- # Replace '' with 0
130
- values = replace_empty_strings_with_zeros(values)
131
- # Replace "-9.999" with 0
132
- values = np.char.replace(values, "-9.999", "0")
133
- # Cast values to float type
134
- # --> Note: the disk encoding is specified in the l0b_encodings.yml
135
- values = values.astype(float)
131
+ return values
132
+
133
+ # Otherwise sanitize the list of value
134
+ # Ensure string type
135
+ values = values.astype("str")
136
+ # Replace '' with 0
137
+ values = replace_empty_strings_with_zeros(values)
138
+ # Replace "-9.999" with 0
139
+ values = np.char.replace(values, "-9.999", "0")
140
+ # Cast values to float type
141
+ # --> Note: the disk encoding is specified in the l0b_encodings.yml
142
+ values = values.astype(float)
136
143
  return values
137
144
 
138
145
 
@@ -678,6 +678,16 @@ def create_l0c_datasets(
678
678
  log_info(logger=logger, msg=f"No data between {start_time} and {end_time}.", verbose=verbose)
679
679
  return {}
680
680
 
681
+ # If 1 or 2 timesteps per time block, return empty dictionary
682
+ n_timesteps = len(ds["time"])
683
+ if n_timesteps < 3:
684
+ log_info(
685
+ logger=logger,
686
+ msg=f"Only {n_timesteps} timesteps between {start_time} and {end_time}.",
687
+ verbose=verbose,
688
+ )
689
+ return {}
690
+
681
691
  # ---------------------------------------------------------------------------------------.
682
692
  # If sample interval is a dataset variable, drop timesteps with unexpected measurement intervals !
683
693
  if "sample_interval" in ds: