disdrodb 0.0.20__py3-none-any.whl → 0.1.0__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 (264) hide show
  1. disdrodb/__init__.py +132 -15
  2. disdrodb/_config.py +4 -2
  3. disdrodb/_version.py +9 -4
  4. disdrodb/api/checks.py +264 -237
  5. disdrodb/api/configs.py +4 -8
  6. disdrodb/api/create_directories.py +235 -290
  7. disdrodb/api/info.py +217 -26
  8. disdrodb/api/io.py +295 -269
  9. disdrodb/api/path.py +597 -173
  10. disdrodb/api/search.py +486 -0
  11. disdrodb/{metadata/scripts → cli}/disdrodb_check_metadata_archive.py +12 -7
  12. disdrodb/{utils/pandas.py → cli/disdrodb_data_archive_directory.py} +9 -18
  13. disdrodb/cli/disdrodb_download_archive.py +86 -0
  14. disdrodb/cli/disdrodb_download_metadata_archive.py +53 -0
  15. disdrodb/cli/disdrodb_download_station.py +84 -0
  16. disdrodb/{api/scripts → cli}/disdrodb_initialize_station.py +22 -10
  17. disdrodb/cli/disdrodb_metadata_archive_directory.py +32 -0
  18. disdrodb/{data_transfer/scripts/disdrodb_download_station.py → cli/disdrodb_open_data_archive.py} +22 -22
  19. disdrodb/cli/disdrodb_open_logs_directory.py +69 -0
  20. disdrodb/{data_transfer/scripts/disdrodb_upload_station.py → cli/disdrodb_open_metadata_archive.py} +22 -24
  21. disdrodb/cli/disdrodb_open_metadata_directory.py +71 -0
  22. disdrodb/cli/disdrodb_open_product_directory.py +74 -0
  23. disdrodb/cli/disdrodb_open_readers_directory.py +32 -0
  24. disdrodb/{l0/scripts → cli}/disdrodb_run_l0.py +38 -31
  25. disdrodb/{l0/scripts → cli}/disdrodb_run_l0_station.py +32 -30
  26. disdrodb/{l0/scripts → cli}/disdrodb_run_l0a.py +30 -21
  27. disdrodb/{l0/scripts → cli}/disdrodb_run_l0a_station.py +24 -33
  28. disdrodb/{l0/scripts → cli}/disdrodb_run_l0b.py +30 -21
  29. disdrodb/{l0/scripts → cli}/disdrodb_run_l0b_station.py +25 -34
  30. disdrodb/cli/disdrodb_run_l0c.py +130 -0
  31. disdrodb/cli/disdrodb_run_l0c_station.py +129 -0
  32. disdrodb/cli/disdrodb_run_l1.py +122 -0
  33. disdrodb/cli/disdrodb_run_l1_station.py +121 -0
  34. disdrodb/cli/disdrodb_run_l2e.py +122 -0
  35. disdrodb/cli/disdrodb_run_l2e_station.py +122 -0
  36. disdrodb/cli/disdrodb_run_l2m.py +122 -0
  37. disdrodb/cli/disdrodb_run_l2m_station.py +122 -0
  38. disdrodb/cli/disdrodb_upload_archive.py +105 -0
  39. disdrodb/cli/disdrodb_upload_station.py +98 -0
  40. disdrodb/configs.py +90 -25
  41. disdrodb/data_transfer/__init__.py +22 -0
  42. disdrodb/data_transfer/download_data.py +87 -90
  43. disdrodb/data_transfer/upload_data.py +64 -37
  44. disdrodb/data_transfer/zenodo.py +15 -18
  45. disdrodb/docs.py +1 -1
  46. disdrodb/issue/__init__.py +17 -4
  47. disdrodb/issue/checks.py +10 -23
  48. disdrodb/issue/reader.py +9 -12
  49. disdrodb/issue/writer.py +14 -17
  50. disdrodb/l0/__init__.py +17 -26
  51. disdrodb/l0/check_configs.py +35 -23
  52. disdrodb/l0/check_standards.py +32 -42
  53. disdrodb/l0/configs/{Thies_LPM → LPM}/bins_diameter.yml +44 -44
  54. disdrodb/l0/configs/{Thies_LPM → LPM}/bins_velocity.yml +40 -40
  55. disdrodb/l0/configs/LPM/l0a_encodings.yml +80 -0
  56. disdrodb/l0/configs/{Thies_LPM → LPM}/l0b_cf_attrs.yml +62 -59
  57. disdrodb/l0/configs/{Thies_LPM → LPM}/l0b_encodings.yml +9 -9
  58. disdrodb/l0/configs/{Thies_LPM → LPM}/raw_data_format.yml +245 -245
  59. disdrodb/l0/configs/{OTT_Parsivel → PARSIVEL}/bins_diameter.yml +66 -66
  60. disdrodb/l0/configs/{OTT_Parsivel → PARSIVEL}/bins_velocity.yml +64 -64
  61. disdrodb/l0/configs/PARSIVEL/l0a_encodings.yml +32 -0
  62. disdrodb/l0/configs/{OTT_Parsivel → PARSIVEL}/l0b_cf_attrs.yml +22 -20
  63. disdrodb/l0/configs/{OTT_Parsivel → PARSIVEL}/l0b_encodings.yml +17 -17
  64. disdrodb/l0/configs/{OTT_Parsivel → PARSIVEL}/raw_data_format.yml +77 -77
  65. disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/bins_diameter.yml +64 -64
  66. disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/bins_velocity.yml +64 -64
  67. disdrodb/l0/configs/PARSIVEL2/l0a_encodings.yml +39 -0
  68. disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/l0b_cf_attrs.yml +24 -22
  69. disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/l0b_encodings.yml +20 -20
  70. disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/raw_data_format.yml +98 -98
  71. disdrodb/l0/configs/{RD_80 → RD80}/bins_diameter.yml +40 -40
  72. disdrodb/l0/configs/RD80/l0a_encodings.yml +16 -0
  73. disdrodb/l0/configs/{RD_80 → RD80}/l0b_cf_attrs.yml +3 -3
  74. disdrodb/l0/configs/RD80/l0b_encodings.yml +135 -0
  75. disdrodb/l0/configs/{RD_80 → RD80}/raw_data_format.yml +48 -48
  76. disdrodb/l0/l0_reader.py +216 -340
  77. disdrodb/l0/l0a_processing.py +237 -208
  78. disdrodb/l0/l0b_nc_processing.py +227 -80
  79. disdrodb/l0/l0b_processing.py +93 -173
  80. disdrodb/l0/l0c_processing.py +627 -0
  81. disdrodb/l0/readers/{ARM → LPM/ARM}/ARM_LPM.py +36 -58
  82. disdrodb/l0/readers/LPM/AUSTRALIA/MELBOURNE_2007_LPM.py +226 -0
  83. disdrodb/l0/readers/LPM/BRAZIL/CHUVA_LPM.py +185 -0
  84. disdrodb/l0/readers/LPM/BRAZIL/GOAMAZON_LPM.py +183 -0
  85. disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +179 -0
  86. disdrodb/l0/readers/{UK → LPM/UK}/DIVEN.py +14 -35
  87. disdrodb/l0/readers/PARSIVEL/AUSTRALIA/MELBOURNE_2007_PARSIVEL.py +157 -0
  88. disdrodb/l0/readers/PARSIVEL/CHINA/CHONGQING.py +113 -0
  89. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/ARCTIC_2021.py +40 -57
  90. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/COMMON_2011.py +37 -54
  91. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/DAVOS_2009_2011.py +34 -51
  92. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/EPFL_2009.py +34 -51
  93. disdrodb/l0/readers/{EPFL/PARADISO_2014.py → PARSIVEL/EPFL/EPFL_ROOF_2008.py} +38 -50
  94. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2010.py +105 -0
  95. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/EPFL_ROOF_2011.py +34 -51
  96. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/EPFL_ROOF_2012.py +33 -51
  97. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/GENEPI_2007.py +25 -44
  98. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/GRAND_ST_BERNARD_2007.py +25 -44
  99. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/GRAND_ST_BERNARD_2007_2.py +25 -44
  100. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/HPICONET_2010.py +34 -51
  101. disdrodb/l0/readers/{EPFL/EPFL_ROOF_2010.py → PARSIVEL/EPFL/HYMEX_LTE_SOP2.py} +37 -50
  102. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP3.py +111 -0
  103. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/HYMEX_LTE_SOP4.py +36 -54
  104. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/LOCARNO_2018.py +34 -52
  105. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/LOCARNO_2019.py +38 -56
  106. disdrodb/l0/readers/PARSIVEL/EPFL/PARADISO_2014.py +105 -0
  107. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/PARSIVEL_2007.py +27 -45
  108. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/PLATO_2019.py +24 -44
  109. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019.py +140 -0
  110. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/RACLETS_2019_WJF.py +41 -59
  111. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/RIETHOLZBACH_2011.py +34 -51
  112. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2017.py +117 -0
  113. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2019.py +137 -0
  114. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/UNIL_2022.py +42 -55
  115. disdrodb/l0/readers/PARSIVEL/GPM/IFLOODS.py +104 -0
  116. disdrodb/l0/readers/{GPM → PARSIVEL/GPM}/LPVEX.py +29 -48
  117. disdrodb/l0/readers/PARSIVEL/GPM/MC3E.py +184 -0
  118. disdrodb/l0/readers/PARSIVEL/NCAR/CCOPE_2015.py +113 -0
  119. disdrodb/l0/readers/{NCAR/VORTEX_SE_2016_P1.py → PARSIVEL/NCAR/OWLES_MIPS.py} +46 -72
  120. disdrodb/l0/readers/PARSIVEL/NCAR/PECAN_MOBILE.py +125 -0
  121. disdrodb/l0/readers/{NCAR/OWLES_MIPS.py → PARSIVEL/NCAR/PLOWS_MIPS.py} +45 -64
  122. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2009.py +114 -0
  123. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010.py +176 -0
  124. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010_UF.py +183 -0
  125. disdrodb/l0/readers/{ARM/ARM_LD.py → PARSIVEL2/ARM/ARM_PARSIVEL2.py} +27 -50
  126. disdrodb/l0/readers/PARSIVEL2/BRAZIL/CHUVA_PARSIVEL2.py +163 -0
  127. disdrodb/l0/readers/PARSIVEL2/BRAZIL/GOAMAZON_PARSIVEL2.py +163 -0
  128. disdrodb/l0/readers/{DENMARK → PARSIVEL2/DENMARK}/EROSION_nc.py +14 -35
  129. disdrodb/l0/readers/PARSIVEL2/FRANCE/SIRTA_PARSIVEL2.py +119 -0
  130. disdrodb/l0/readers/PARSIVEL2/GPM/GCPEX.py +104 -0
  131. disdrodb/l0/readers/PARSIVEL2/GPM/NSSTC.py +176 -0
  132. disdrodb/l0/readers/PARSIVEL2/ITALY/GID_PARSIVEL2.py +32 -0
  133. disdrodb/l0/readers/PARSIVEL2/MEXICO/OH_IIUNAM_nc.py +56 -0
  134. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_FP3.py +120 -0
  135. disdrodb/l0/readers/{NCAR → PARSIVEL2/NCAR}/PECAN_MIPS.py +45 -64
  136. disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +181 -0
  137. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_PJ.py +160 -0
  138. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_SB.py +160 -0
  139. disdrodb/l0/readers/{NCAR/PLOWS_MIPS.py → PARSIVEL2/NCAR/VORTEX_SE_2016_P1.py} +49 -66
  140. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P2.py +118 -0
  141. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py +152 -0
  142. disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT.py +166 -0
  143. disdrodb/l0/readers/{NCAR/RELAMPAGO_RD80.py → RD80/BRAZIL/CHUVA_RD80.py} +36 -60
  144. disdrodb/l0/readers/{BRAZIL → RD80/BRAZIL}/GOAMAZON_RD80.py +36 -55
  145. disdrodb/l0/readers/{NCAR → RD80/NCAR}/CINDY_2011_RD80.py +35 -54
  146. disdrodb/l0/readers/{BRAZIL/CHUVA_RD80.py → RD80/NCAR/RELAMPAGO_RD80.py} +40 -54
  147. disdrodb/l0/readers/template_reader_raw_netcdf_data.py +62 -0
  148. disdrodb/l0/readers/{reader_template.py → template_reader_raw_text_data.py} +20 -44
  149. disdrodb/l0/routines.py +885 -581
  150. disdrodb/l0/standards.py +72 -236
  151. disdrodb/l0/template_tools.py +104 -109
  152. disdrodb/l1/__init__.py +17 -0
  153. disdrodb/l1/beard_model.py +716 -0
  154. disdrodb/l1/encoding_attrs.py +620 -0
  155. disdrodb/l1/fall_velocity.py +260 -0
  156. disdrodb/l1/filters.py +192 -0
  157. disdrodb/l1/processing.py +200 -0
  158. disdrodb/l1/resampling.py +236 -0
  159. disdrodb/l1/routines.py +357 -0
  160. disdrodb/l1_env/__init__.py +17 -0
  161. disdrodb/l1_env/routines.py +38 -0
  162. disdrodb/l2/__init__.py +17 -0
  163. disdrodb/l2/empirical_dsd.py +1735 -0
  164. disdrodb/l2/event.py +388 -0
  165. disdrodb/l2/processing.py +519 -0
  166. disdrodb/l2/processing_options.py +213 -0
  167. disdrodb/l2/routines.py +868 -0
  168. disdrodb/metadata/__init__.py +9 -2
  169. disdrodb/metadata/checks.py +165 -118
  170. disdrodb/metadata/download.py +81 -0
  171. disdrodb/metadata/geolocation.py +146 -0
  172. disdrodb/metadata/info.py +20 -13
  173. disdrodb/metadata/manipulation.py +1 -1
  174. disdrodb/metadata/reader.py +59 -8
  175. disdrodb/metadata/search.py +77 -144
  176. disdrodb/metadata/standards.py +7 -8
  177. disdrodb/metadata/writer.py +8 -14
  178. disdrodb/psd/__init__.py +38 -0
  179. disdrodb/psd/fitting.py +2146 -0
  180. disdrodb/psd/models.py +774 -0
  181. disdrodb/routines.py +1176 -0
  182. disdrodb/scattering/__init__.py +28 -0
  183. disdrodb/scattering/axis_ratio.py +344 -0
  184. disdrodb/scattering/routines.py +456 -0
  185. disdrodb/utils/__init__.py +17 -0
  186. disdrodb/utils/attrs.py +208 -0
  187. disdrodb/utils/cli.py +269 -0
  188. disdrodb/utils/compression.py +60 -42
  189. disdrodb/utils/dask.py +62 -0
  190. disdrodb/utils/decorators.py +110 -0
  191. disdrodb/utils/directories.py +107 -46
  192. disdrodb/utils/encoding.py +127 -0
  193. disdrodb/utils/list.py +29 -0
  194. disdrodb/utils/logger.py +168 -46
  195. disdrodb/utils/time.py +657 -0
  196. disdrodb/utils/warnings.py +30 -0
  197. disdrodb/utils/writer.py +57 -0
  198. disdrodb/utils/xarray.py +138 -47
  199. disdrodb/utils/yaml.py +0 -1
  200. disdrodb/viz/__init__.py +17 -0
  201. disdrodb/viz/plots.py +17 -0
  202. disdrodb-0.1.0.dist-info/METADATA +321 -0
  203. disdrodb-0.1.0.dist-info/RECORD +216 -0
  204. {disdrodb-0.0.20.dist-info → disdrodb-0.1.0.dist-info}/WHEEL +1 -1
  205. disdrodb-0.1.0.dist-info/entry_points.txt +30 -0
  206. disdrodb/data_transfer/scripts/disdrodb_download_archive.py +0 -53
  207. disdrodb/data_transfer/scripts/disdrodb_upload_archive.py +0 -57
  208. disdrodb/l0/configs/OTT_Parsivel/l0a_encodings.yml +0 -32
  209. disdrodb/l0/configs/OTT_Parsivel2/l0a_encodings.yml +0 -39
  210. disdrodb/l0/configs/RD_80/l0a_encodings.yml +0 -16
  211. disdrodb/l0/configs/RD_80/l0b_encodings.yml +0 -135
  212. disdrodb/l0/configs/Thies_LPM/l0a_encodings.yml +0 -80
  213. disdrodb/l0/io.py +0 -257
  214. disdrodb/l0/l0_processing.py +0 -1091
  215. disdrodb/l0/readers/AUSTRALIA/MELBOURNE_2007_OTT.py +0 -178
  216. disdrodb/l0/readers/AUSTRALIA/MELBOURNE_2007_THIES.py +0 -247
  217. disdrodb/l0/readers/BRAZIL/CHUVA_LPM.py +0 -204
  218. disdrodb/l0/readers/BRAZIL/CHUVA_OTT.py +0 -183
  219. disdrodb/l0/readers/BRAZIL/GOAMAZON_LPM.py +0 -204
  220. disdrodb/l0/readers/BRAZIL/GOAMAZON_OTT.py +0 -183
  221. disdrodb/l0/readers/CHINA/CHONGQING.py +0 -131
  222. disdrodb/l0/readers/EPFL/EPFL_ROOF_2008.py +0 -128
  223. disdrodb/l0/readers/EPFL/HYMEX_LTE_SOP2.py +0 -127
  224. disdrodb/l0/readers/EPFL/HYMEX_LTE_SOP3.py +0 -129
  225. disdrodb/l0/readers/EPFL/RACLETS_2019.py +0 -158
  226. disdrodb/l0/readers/EPFL/SAMOYLOV_2017.py +0 -136
  227. disdrodb/l0/readers/EPFL/SAMOYLOV_2019.py +0 -158
  228. disdrodb/l0/readers/FRANCE/SIRTA_OTT2.py +0 -138
  229. disdrodb/l0/readers/GPM/GCPEX.py +0 -123
  230. disdrodb/l0/readers/GPM/IFLOODS.py +0 -123
  231. disdrodb/l0/readers/GPM/MC3E.py +0 -123
  232. disdrodb/l0/readers/GPM/NSSTC.py +0 -164
  233. disdrodb/l0/readers/ITALY/GID.py +0 -199
  234. disdrodb/l0/readers/MEXICO/OH_IIUNAM_nc.py +0 -92
  235. disdrodb/l0/readers/NCAR/CCOPE_2015.py +0 -133
  236. disdrodb/l0/readers/NCAR/PECAN_FP3.py +0 -137
  237. disdrodb/l0/readers/NCAR/PECAN_MOBILE.py +0 -144
  238. disdrodb/l0/readers/NCAR/RELAMPAGO_OTT.py +0 -195
  239. disdrodb/l0/readers/NCAR/SNOWIE_PJ.py +0 -172
  240. disdrodb/l0/readers/NCAR/SNOWIE_SB.py +0 -179
  241. disdrodb/l0/readers/NCAR/VORTEX2_2009.py +0 -133
  242. disdrodb/l0/readers/NCAR/VORTEX2_2010.py +0 -188
  243. disdrodb/l0/readers/NCAR/VORTEX2_2010_UF.py +0 -191
  244. disdrodb/l0/readers/NCAR/VORTEX_SE_2016_P2.py +0 -135
  245. disdrodb/l0/readers/NCAR/VORTEX_SE_2016_PIPS.py +0 -170
  246. disdrodb/l0/readers/NETHERLANDS/DELFT.py +0 -187
  247. disdrodb/l0/readers/SPAIN/SBEGUERIA.py +0 -179
  248. disdrodb/l0/scripts/disdrodb_run_l0b_concat.py +0 -93
  249. disdrodb/l0/scripts/disdrodb_run_l0b_concat_station.py +0 -85
  250. disdrodb/utils/netcdf.py +0 -452
  251. disdrodb/utils/scripts.py +0 -102
  252. disdrodb-0.0.20.dist-info/AUTHORS.md +0 -18
  253. disdrodb-0.0.20.dist-info/METADATA +0 -186
  254. disdrodb-0.0.20.dist-info/RECORD +0 -168
  255. disdrodb-0.0.20.dist-info/entry_points.txt +0 -15
  256. /disdrodb/l0/configs/{RD_80 → RD80}/bins_velocity.yml +0 -0
  257. /disdrodb/l0/manuals/{Thies_LPM.pdf → LPM.pdf} +0 -0
  258. /disdrodb/l0/manuals/{ODM_470.pdf → ODM470.pdf} +0 -0
  259. /disdrodb/l0/manuals/{OTT_Parsivel.pdf → PARSIVEL.pdf} +0 -0
  260. /disdrodb/l0/manuals/{OTT_Parsivel2.pdf → PARSIVEL2.pdf} +0 -0
  261. /disdrodb/l0/manuals/{PWS_100.pdf → PWS100.pdf} +0 -0
  262. /disdrodb/l0/manuals/{RD_80.pdf → RD80.pdf} +0 -0
  263. {disdrodb-0.0.20.dist-info → disdrodb-0.1.0.dist-info/licenses}/LICENSE +0 -0
  264. {disdrodb-0.0.20.dist-info → disdrodb-0.1.0.dist-info}/top_level.txt +0 -0
@@ -1,183 +0,0 @@
1
- #!/usr/bin/env python3
2
- # -----------------------------------------------------------------------------.
3
- # Copyright (c) 2021-2023 DISDRODB developers
4
- #
5
- # This program is free software: you can redistribute it and/or modify
6
- # it under the terms of the GNU General Public License as published by
7
- # the Free Software Foundation, either version 3 of the License, or
8
- # (at your option) any later version.
9
- #
10
- # This program is distributed in the hope that it will be useful,
11
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- # GNU General Public License for more details.
14
- #
15
- # You should have received a copy of the GNU General Public License
16
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
- # -----------------------------------------------------------------------------.
18
- from disdrodb.l0 import run_l0a
19
- from disdrodb.l0.l0_reader import is_documented_by, reader_generic_docstring
20
-
21
-
22
- @is_documented_by(reader_generic_docstring)
23
- def reader(
24
- raw_dir,
25
- processed_dir,
26
- station_name,
27
- # Processing options
28
- force=False,
29
- verbose=False,
30
- parallel=False,
31
- debugging_mode=False,
32
- ):
33
- ##------------------------------------------------------------------------.
34
- #### - Define column names
35
- column_names = ["TO_PARSE"]
36
-
37
- ##------------------------------------------------------------------------.
38
- #### - Define reader options
39
- reader_kwargs = {}
40
- # - Define delimiter
41
- reader_kwargs["delimiter"] = "\\n"
42
- # - Skip first row as columns names
43
- # - Define encoding
44
- reader_kwargs["encoding"] = "latin" # "ISO-8859-1"
45
- # - Avoid first column to become df index !!!
46
- reader_kwargs["index_col"] = False
47
- # - Define behaviour when encountering bad lines
48
- reader_kwargs["on_bad_lines"] = "skip"
49
- # - Define reader engine
50
- # - C engine is faster
51
- # - Python engine is more feature-complete
52
- reader_kwargs["engine"] = "python"
53
- # - Define on-the-fly decompression of on-disk data
54
- # - Available: gzip, bz2, zip
55
- reader_kwargs["compression"] = "infer"
56
- # - Strings to recognize as NA/NaN and replace with standard NA flags
57
- # - Already included: ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,
58
- # ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘<NA>’, ‘N/A’,
59
- # ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’
60
- reader_kwargs["na_values"] = ["na", "", "error"]
61
-
62
- ##------------------------------------------------------------------------.
63
- #### - Define dataframe sanitizer function for L0 processing
64
- def df_sanitizer_fun(df):
65
- # Import numpy and pandas
66
- import numpy as np
67
- import pandas as pd
68
-
69
- # Create ID and Value columns
70
- df = df["TO_PARSE"].str.split(":", expand=True, n=1)
71
- df.columns = ["ID", "Value"]
72
-
73
- # Drop rows with no values
74
- df = df[df["Value"].astype(bool)]
75
-
76
- # Convert ID to integer
77
- # - First convert to numeric and if errors arise (corrupted rows), drop rows
78
- df["ID"] = pd.to_numeric(df["ID"], errors="coerce")
79
- df = df.dropna(subset="ID")
80
- df["ID"] = df["ID"].astype(int)
81
-
82
- # Create the dataframe with each row corresponding to a timestep
83
- # - Group rows based on when ID values restart
84
- groups = df.groupby((df["ID"].diff() <= 0).cumsum())
85
-
86
- # - Reshape the dataframe
87
- group_dfs = []
88
- for _, group in groups:
89
- group_df = group.set_index("ID").T
90
- group_dfs.append(group_df)
91
-
92
- # - Merge each timestep dataframe
93
- # --> Missing columns are infilled by NaN
94
- df = pd.concat(group_dfs, axis=0)
95
- df.columns = df.columns.astype(str).str.pad(width=2, side="left", fillchar="0")
96
-
97
- # Define available column names
98
- column_dict = {
99
- "01": "rainfall_rate_32bit",
100
- "02": "rainfall_accumulated_32bit",
101
- "03": "weather_code_synop_4680",
102
- "04": "weather_code_synop_4677",
103
- "05": "weather_code_metar_4678",
104
- "06": "weather_code_nws",
105
- "07": "reflectivity_32bit",
106
- "08": "mor_visibility",
107
- "09": "sample_interval",
108
- "10": "laser_amplitude",
109
- "11": "number_particles",
110
- "12": "sensor_temperature",
111
- # "13": "sensor_serial_number",
112
- # "14": "firmware_iop",
113
- # "15": "firmware_dsp",
114
- "16": "sensor_heating_current",
115
- "17": "sensor_battery_voltage",
116
- "18": "sensor_status",
117
- # "19": "start_time",
118
- "20": "sensor_time",
119
- "21": "sensor_date",
120
- # "22": "station_name",
121
- # "23": "station_number",
122
- "24": "rainfall_amount_absolute_32bit",
123
- "25": "error_code",
124
- "30": "rainfall_rate_16_bit_30",
125
- "31": "rainfall_rate_16_bit_1200",
126
- "32": "rainfall_accumulated_16bit",
127
- "90": "raw_drop_concentration",
128
- "91": "raw_drop_average_velocity",
129
- "93": "raw_drop_number",
130
- }
131
-
132
- # Identify missing columns and add NaN
133
- expected_columns = np.array(list(column_dict.keys()))
134
- missing_columns = expected_columns[np.isin(expected_columns, df.columns, invert=True)].tolist()
135
- if len(missing_columns) > 0:
136
- for column in missing_columns:
137
- df[column] = "NaN"
138
-
139
- # Rename columns
140
- df = df.rename(column_dict, axis=1)
141
-
142
- # - Keep only columns defined in the dictionary
143
- df = df[list(column_dict.values())]
144
-
145
- # - Define datetime "time" column
146
- df["time"] = df["sensor_date"] + "-" + df["sensor_time"]
147
- df["time"] = pd.to_datetime(df["time"], format="%d.%m.%Y-%H:%M:%S", errors="coerce")
148
-
149
- # - Drop columns not agreeing with DISDRODB L0 standards
150
- columns_to_drop = [
151
- "sensor_date",
152
- "sensor_time",
153
- # "firmware_iop",
154
- # "firmware_dsp",
155
- # "sensor_serial_number",
156
- # "station_name",
157
- # "station_number",
158
- ]
159
- df = df.drop(columns=columns_to_drop)
160
-
161
- return df
162
-
163
- ##------------------------------------------------------------------------.
164
- #### - Define glob pattern to search data files in <raw_dir>/data/<station_name>
165
- glob_patterns = "DISL*"
166
-
167
- ####----------------------------------------------------------------------.
168
- #### - Create L0A products
169
- run_l0a(
170
- raw_dir=raw_dir,
171
- processed_dir=processed_dir,
172
- station_name=station_name,
173
- # Custom arguments of the reader for L0A processing
174
- glob_patterns=glob_patterns,
175
- column_names=column_names,
176
- reader_kwargs=reader_kwargs,
177
- df_sanitizer_fun=df_sanitizer_fun,
178
- # Processing options
179
- force=force,
180
- verbose=verbose,
181
- parallel=parallel,
182
- debugging_mode=debugging_mode,
183
- )
@@ -1,204 +0,0 @@
1
- #!/usr/bin/env python3
2
- # -----------------------------------------------------------------------------.
3
- # Copyright (c) 2021-2023 DISDRODB developers
4
- #
5
- # This program is free software: you can redistribute it and/or modify
6
- # it under the terms of the GNU General Public License as published by
7
- # the Free Software Foundation, either version 3 of the License, or
8
- # (at your option) any later version.
9
- #
10
- # This program is distributed in the hope that it will be useful,
11
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- # GNU General Public License for more details.
14
- #
15
- # You should have received a copy of the GNU General Public License
16
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
- # -----------------------------------------------------------------------------.
18
- from disdrodb.l0 import run_l0a
19
- from disdrodb.l0.l0_reader import is_documented_by, reader_generic_docstring
20
-
21
-
22
- @is_documented_by(reader_generic_docstring)
23
- def reader(
24
- raw_dir,
25
- processed_dir,
26
- station_name,
27
- # Processing options
28
- force=False,
29
- verbose=False,
30
- parallel=False,
31
- debugging_mode=False,
32
- ):
33
- ##------------------------------------------------------------------------.
34
- #### - Define column names
35
- column_names = ["TO_BE_PARSED"]
36
-
37
- ##------------------------------------------------------------------------.
38
- #### - Define reader options
39
- reader_kwargs = {}
40
- # - Define delimiter
41
- reader_kwargs["delimiter"] = "\\n"
42
- # - Skip first row as columns names
43
- # - Define encoding
44
- reader_kwargs["encoding"] = "latin" # "ISO-8859-1"
45
- # - Avoid first column to become df index !!!
46
- reader_kwargs["index_col"] = False
47
- # - Define behaviour when encountering bad lines
48
- reader_kwargs["on_bad_lines"] = "skip"
49
- # - Define reader engine
50
- # - C engine is faster
51
- # - Python engine is more feature-complete
52
- reader_kwargs["engine"] = "python"
53
- # - Define on-the-fly decompression of on-disk data
54
- # - Available: gzip, bz2, zip
55
- reader_kwargs["compression"] = "infer"
56
- # - Strings to recognize as NA/NaN and replace with standard NA flags
57
- # - Already included: ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,
58
- # ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘<NA>’, ‘N/A’,
59
- # ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’
60
- reader_kwargs["na_values"] = ["na", "", "error"]
61
-
62
- ##------------------------------------------------------------------------.
63
- #### - Define dataframe sanitizer function for L0 processing
64
- def df_sanitizer_fun(df):
65
- # - Import pandas
66
- import pandas as pd
67
-
68
- # Count number of delimiters to identify valid rows
69
- df = df[df["TO_BE_PARSED"].str.count(";") == 520]
70
-
71
- # Split by ; delimiter
72
- df = df["TO_BE_PARSED"].str.split(";", expand=True, n=79)
73
-
74
- # Assign column names
75
- column_names = [
76
- "start_identifier",
77
- "device_address",
78
- "sensor_serial_number",
79
- "sensor_date",
80
- "sensor_time",
81
- "weather_code_synop_4677_5min",
82
- "weather_code_synop_4680_5min",
83
- "weather_code_metar_4678_5min",
84
- "precipitation_rate_5min",
85
- "weather_code_synop_4677",
86
- "weather_code_synop_4680",
87
- "weather_code_metar_4678",
88
- "precipitation_rate",
89
- "rainfall_rate",
90
- "snowfall_rate",
91
- "precipitation_accumulated",
92
- "mor_visibility",
93
- "reflectivity",
94
- "quality_index",
95
- "max_hail_diameter",
96
- "laser_status",
97
- "static_signal",
98
- "laser_temperature_analog_status",
99
- "laser_temperature_digital_status",
100
- "laser_current_analog_status",
101
- "laser_current_digital_status",
102
- "sensor_voltage_supply_status",
103
- "current_heating_pane_transmitter_head_status",
104
- "current_heating_pane_receiver_head_status",
105
- "temperature_sensor_status",
106
- "current_heating_voltage_supply_status",
107
- "current_heating_house_status",
108
- "current_heating_heads_status",
109
- "current_heating_carriers_status",
110
- "control_output_laser_power_status",
111
- "reserve_status",
112
- "temperature_interior",
113
- "laser_temperature",
114
- "laser_current_average",
115
- "control_voltage",
116
- "optical_control_voltage_output",
117
- "sensor_voltage_supply",
118
- "current_heating_pane_transmitter_head",
119
- "current_heating_pane_receiver_head",
120
- "temperature_ambient",
121
- "current_heating_voltage_supply",
122
- "current_heating_house",
123
- "current_heating_heads",
124
- "current_heating_carriers",
125
- "number_particles",
126
- "number_particles_internal_data",
127
- "number_particles_min_speed",
128
- "number_particles_min_speed_internal_data",
129
- "number_particles_max_speed",
130
- "number_particles_max_speed_internal_data",
131
- "number_particles_min_diameter",
132
- "number_particles_min_diameter_internal_data",
133
- "number_particles_no_hydrometeor",
134
- "number_particles_no_hydrometeor_internal_data",
135
- "number_particles_unknown_classification",
136
- "number_particles_unknown_classification_internal_data",
137
- "number_particles_class_1",
138
- "number_particles_class_1_internal_data",
139
- "number_particles_class_2",
140
- "number_particles_class_2_internal_data",
141
- "number_particles_class_3",
142
- "number_particles_class_3_internal_data",
143
- "number_particles_class_4",
144
- "number_particles_class_4_internal_data",
145
- "number_particles_class_5",
146
- "number_particles_class_5_internal_data",
147
- "number_particles_class_6",
148
- "number_particles_class_6_internal_data",
149
- "number_particles_class_7",
150
- "number_particles_class_7_internal_data",
151
- "number_particles_class_8",
152
- "number_particles_class_8_internal_data",
153
- "number_particles_class_9",
154
- "number_particles_class_9_internal_data",
155
- "raw_drop_number",
156
- ]
157
- df.columns = column_names
158
-
159
- # Define datetime "time" column
160
- df["time"] = df["sensor_date"] + "-" + df["sensor_time"]
161
- df["time"] = pd.to_datetime(df["time"], format="%d.%m.%y-%H:%M:%S", errors="coerce")
162
-
163
- # Drop row if start_identifier different than 00
164
- df = df[df["start_identifier"].astype(str) == "00"]
165
-
166
- # Clean raw_drop_number (ignore last "AC" character)
167
- df["raw_drop_number"] = df["raw_drop_number"].str[:1760]
168
-
169
- # Drop rows with invalid raw_drop_number
170
- df = df[df["raw_drop_number"].astype(str).str.len() == 1760]
171
-
172
- # - Drop columns not agreeing with DISDRODB L0 standards
173
- columns_to_drop = [
174
- "start_identifier",
175
- "device_address",
176
- "sensor_serial_number",
177
- "sensor_date",
178
- "sensor_time",
179
- ]
180
- df = df.drop(columns=columns_to_drop)
181
-
182
- return df
183
-
184
- ##------------------------------------------------------------------------.
185
- #### - Define glob pattern to search data files in <raw_dir>/data/<station_name>
186
- glob_patterns = "*/*/DISL*" # <year>/<month>
187
-
188
- ####----------------------------------------------------------------------.
189
- #### - Create L0A products
190
- run_l0a(
191
- raw_dir=raw_dir,
192
- processed_dir=processed_dir,
193
- station_name=station_name,
194
- # Custom arguments of the reader for L0A processing
195
- glob_patterns=glob_patterns,
196
- column_names=column_names,
197
- reader_kwargs=reader_kwargs,
198
- df_sanitizer_fun=df_sanitizer_fun,
199
- # Processing options
200
- force=force,
201
- verbose=verbose,
202
- parallel=parallel,
203
- debugging_mode=debugging_mode,
204
- )
@@ -1,183 +0,0 @@
1
- #!/usr/bin/env python3
2
- # -----------------------------------------------------------------------------.
3
- # Copyright (c) 2021-2023 DISDRODB developers
4
- #
5
- # This program is free software: you can redistribute it and/or modify
6
- # it under the terms of the GNU General Public License as published by
7
- # the Free Software Foundation, either version 3 of the License, or
8
- # (at your option) any later version.
9
- #
10
- # This program is distributed in the hope that it will be useful,
11
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- # GNU General Public License for more details.
14
- #
15
- # You should have received a copy of the GNU General Public License
16
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
- # -----------------------------------------------------------------------------.
18
- from disdrodb.l0 import run_l0a
19
- from disdrodb.l0.l0_reader import is_documented_by, reader_generic_docstring
20
-
21
-
22
- @is_documented_by(reader_generic_docstring)
23
- def reader(
24
- raw_dir,
25
- processed_dir,
26
- station_name,
27
- # Processing options
28
- force=False,
29
- verbose=False,
30
- parallel=False,
31
- debugging_mode=False,
32
- ):
33
- ##------------------------------------------------------------------------.
34
- #### - Define column names
35
- column_names = ["TO_PARSE"]
36
-
37
- ##------------------------------------------------------------------------.
38
- #### - Define reader options
39
- reader_kwargs = {}
40
- # - Define delimiter
41
- reader_kwargs["delimiter"] = "\\n"
42
- # - Skip first row as columns names
43
- # - Define encoding
44
- reader_kwargs["encoding"] = "latin" # "ISO-8859-1"
45
- # - Avoid first column to become df index !!!
46
- reader_kwargs["index_col"] = False
47
- # - Define behaviour when encountering bad lines
48
- reader_kwargs["on_bad_lines"] = "skip"
49
- # - Define reader engine
50
- # - C engine is faster
51
- # - Python engine is more feature-complete
52
- reader_kwargs["engine"] = "python"
53
- # - Define on-the-fly decompression of on-disk data
54
- # - Available: gzip, bz2, zip
55
- reader_kwargs["compression"] = "infer"
56
- # - Strings to recognize as NA/NaN and replace with standard NA flags
57
- # - Already included: ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,
58
- # ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘<NA>’, ‘N/A’,
59
- # ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’
60
- reader_kwargs["na_values"] = ["na", "", "error"]
61
-
62
- ##------------------------------------------------------------------------.
63
- #### - Define dataframe sanitizer function for L0 processing
64
- def df_sanitizer_fun(df):
65
- # - Import numpy and pandas
66
- import numpy as np
67
- import pandas as pd
68
-
69
- # Create ID and Value columns
70
- df = df["TO_PARSE"].str.split(":", expand=True, n=1)
71
- df.columns = ["ID", "Value"]
72
-
73
- # Drop rows with no values
74
- df = df[df["Value"].astype(bool)]
75
-
76
- # Convert ID to integer
77
- # - First convert to numeric and if errors arise (corrupted rows), drop rows
78
- df["ID"] = pd.to_numeric(df["ID"], errors="coerce")
79
- df = df.dropna(subset="ID")
80
- df["ID"] = df["ID"].astype(int)
81
-
82
- # Create the dataframe with each row corresponding to a timestep
83
- # - Group rows based on when ID values restart
84
- groups = df.groupby((df["ID"].diff() <= 0).cumsum())
85
-
86
- # - Reshape the dataframe
87
- group_dfs = []
88
- for _, group in groups:
89
- group_df = group.set_index("ID").T
90
- group_dfs.append(group_df)
91
-
92
- # - Merge each timestep dataframe
93
- # --> Missing columns are infilled by NaN
94
- df = pd.concat(group_dfs, axis=0)
95
- df.columns = df.columns.astype(str).str.pad(width=2, side="left", fillchar="0")
96
-
97
- # Assign column names
98
- column_dict = {
99
- "01": "rainfall_rate_32bit",
100
- "02": "rainfall_accumulated_32bit",
101
- "03": "weather_code_synop_4680",
102
- "04": "weather_code_synop_4677",
103
- "05": "weather_code_metar_4678",
104
- "06": "weather_code_nws",
105
- "07": "reflectivity_32bit",
106
- "08": "mor_visibility",
107
- "09": "sample_interval",
108
- "10": "laser_amplitude",
109
- "11": "number_particles",
110
- "12": "sensor_temperature",
111
- # "13": "sensor_serial_number",
112
- # "14": "firmware_iop",
113
- # "15": "firmware_dsp",
114
- "16": "sensor_heating_current",
115
- "17": "sensor_battery_voltage",
116
- "18": "sensor_status",
117
- # "19": "start_time",
118
- "20": "sensor_time",
119
- "21": "sensor_date",
120
- # "22": "station_name",
121
- # "23": "station_number",
122
- "24": "rainfall_amount_absolute_32bit",
123
- "25": "error_code",
124
- "30": "rainfall_rate_16_bit_30",
125
- "31": "rainfall_rate_16_bit_1200",
126
- "32": "rainfall_accumulated_16bit",
127
- "90": "raw_drop_concentration",
128
- "91": "raw_drop_average_velocity",
129
- "93": "raw_drop_number",
130
- }
131
-
132
- # Identify missing columns and add NaN
133
- expected_columns = np.array(list(column_dict.keys()))
134
- missing_columns = expected_columns[np.isin(expected_columns, df.columns, invert=True)].tolist()
135
- if len(missing_columns) > 0:
136
- for column in missing_columns:
137
- df[column] = "NaN"
138
-
139
- # Rename columns
140
- df = df.rename(column_dict, axis=1)
141
-
142
- # - Keep only columns defined in the dictionary
143
- df = df[list(column_dict.values())]
144
-
145
- # - Define datetime "time" column
146
- df["time"] = df["sensor_date"] + "-" + df["sensor_time"]
147
- df["time"] = pd.to_datetime(df["time"], format="%d.%m.%Y-%H:%M:%S", errors="coerce")
148
-
149
- # - Drop columns not agreeing with DISDRODB L0 standards
150
- columns_to_drop = [
151
- "sensor_date",
152
- "sensor_time",
153
- # "firmware_iop",
154
- # "firmware_dsp",
155
- # "sensor_serial_number",
156
- # "station_name",
157
- # "station_number",
158
- ]
159
- df = df.drop(columns=columns_to_drop)
160
-
161
- return df
162
-
163
- ##------------------------------------------------------------------------.
164
- #### - Define glob pattern to search data files in <raw_dir>/data/<station_name>
165
- glob_patterns = "*/*/DISL*" # <year>/<month>
166
-
167
- ####----------------------------------------------------------------------.
168
- #### - Create L0A products
169
- run_l0a(
170
- raw_dir=raw_dir,
171
- processed_dir=processed_dir,
172
- station_name=station_name,
173
- # Custom arguments of the reader for L0A processing
174
- glob_patterns=glob_patterns,
175
- column_names=column_names,
176
- reader_kwargs=reader_kwargs,
177
- df_sanitizer_fun=df_sanitizer_fun,
178
- # Processing options
179
- force=force,
180
- verbose=verbose,
181
- parallel=parallel,
182
- debugging_mode=debugging_mode,
183
- )