disdrodb 0.0.21__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.21.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.21.dist-info/AUTHORS.md +0 -18
  253. disdrodb-0.0.21.dist-info/METADATA +0 -186
  254. disdrodb-0.0.21.dist-info/RECORD +0 -168
  255. disdrodb-0.0.21.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.21.dist-info → disdrodb-0.1.0.dist-info/licenses}/LICENSE +0 -0
  264. {disdrodb-0.0.21.dist-info → disdrodb-0.1.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,166 @@
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
+ import pandas as pd
19
+
20
+ from disdrodb.l0.l0_reader import is_documented_by, reader_generic_docstring
21
+ from disdrodb.l0.l0a_processing import read_raw_text_file
22
+
23
+
24
+ @is_documented_by(reader_generic_docstring)
25
+ def reader(
26
+ filepath,
27
+ logger=None,
28
+ ):
29
+ """Reader."""
30
+ ##------------------------------------------------------------------------.
31
+ #### Define column names
32
+ column_names = ["time", "epoch_time", "TO_BE_PARSED"]
33
+
34
+ ##------------------------------------------------------------------------.
35
+ #### Define reader options
36
+ reader_kwargs = {}
37
+ # - Define delimiter
38
+ reader_kwargs["delimiter"] = ";"
39
+ # - Skip first row as columns names
40
+ reader_kwargs["header"] = None
41
+ # - Avoid first column to become df index
42
+ reader_kwargs["index_col"] = False
43
+ # - Define behaviour when encountering bad lines
44
+ reader_kwargs["on_bad_lines"] = "skip"
45
+ # - Define parser engine
46
+ # - C engine is faster
47
+ # - Python engine is more feature-complete
48
+ reader_kwargs["engine"] = "python"
49
+ # - Define on-the-fly decompression of on-disk data
50
+ # - Available: gzip, bz2, zip
51
+ reader_kwargs["compression"] = "infer"
52
+ # reader_kwargs['zipped'] = False
53
+ # reader_kwargs['zipped'] = True
54
+ # - Strings to recognize as NA/NaN and replace with standard NA flags
55
+ # - Already included: '#N/A', '#N/A N/A', '#NA', '-1.#IND', '-1.#QNAN',
56
+ # '-NaN', '-nan', '1.#IND', '1.#QNAN', '<NA>', 'N/A',
57
+ # 'NA', 'NULL', 'NaN', 'n/a', 'nan', 'null'
58
+ reader_kwargs["na_values"] = ["na", "", "error", "-.-", " NA"]
59
+ ##------------------------------------------------------------------------.
60
+ #### Read the data
61
+ df = read_raw_text_file(
62
+ filepath=filepath,
63
+ column_names=column_names,
64
+ reader_kwargs=reader_kwargs,
65
+ logger=logger,
66
+ )
67
+
68
+ ##------------------------------------------------------------------------.
69
+ #### Adapt the dataframe to adhere to DISDRODB L0 standards
70
+ # NOTE: Station 8 has all raw_drop_number corrupted, so it can't be used
71
+
72
+ # Remove rows that have a corrupted "TO_BE_PARSED" column
73
+ # - PAR001, PAR002 have length 3726 (no station_name)
74
+ # - PAR007 have length 3736 ()
75
+ df = df.loc[df["TO_BE_PARSED"].astype(str).str.len() >= 3726]
76
+ df = df.loc[df["TO_BE_PARSED"].astype(str).str.len() <= 3736]
77
+
78
+ # Convert 'time' column to datetime
79
+ df_time = pd.to_datetime(df["time"], format="%Y%m%d-%H%M%S", errors="coerce")
80
+
81
+ # Strip values from start and end of the string
82
+ df["TO_BE_PARSED"] = df["TO_BE_PARSED"].str.lstrip("b'").str.rstrip("'").str.rstrip("\\r\\n'") # noqa: B005
83
+
84
+ # Split the column 'TO_BE_PARSED'
85
+ df_to_parse = df["TO_BE_PARSED"].str.split(";", expand=True, n=99)
86
+
87
+ # Retrieve DISDRODB compliant columns
88
+ df = df_to_parse.iloc[:, 0:35]
89
+
90
+ # Assign column names
91
+ column_names = [
92
+ "rainfall_rate_32bit",
93
+ "rainfall_accumulated_32bit",
94
+ "weather_code_synop_4680",
95
+ "weather_code_synop_4677",
96
+ "weather_code_metar_4678",
97
+ "weather_code_nws",
98
+ "reflectivity_32bit",
99
+ "mor_visibility",
100
+ "sample_interval",
101
+ "laser_amplitude",
102
+ "number_particles",
103
+ "sensor_temperature",
104
+ "sensor_serial_number",
105
+ "firmware_iop",
106
+ "firmware_dsp",
107
+ "sensor_heating_current",
108
+ "sensor_battery_voltage",
109
+ "sensor_status",
110
+ "sensor_time_measurement_start",
111
+ "sensor_time",
112
+ "sensor_date",
113
+ "station_name",
114
+ "station_number",
115
+ "rainfall_amount_absolute_32bit",
116
+ "error_code",
117
+ "sensor_temperature_pcb",
118
+ "sensor_temperature_receiver",
119
+ "sensor_temperature_trasmitter",
120
+ "rainfall_rate_16_bit_30",
121
+ "rainfall_rate_16_bit_1200",
122
+ "rainfall_accumulated_16bit",
123
+ "reflectivity_16bit",
124
+ "rain_kinetic_energy",
125
+ "snowfall_rate",
126
+ "number_particles_all",
127
+ # "number_particles_all_detected",
128
+ ]
129
+ df.columns = column_names
130
+
131
+ # Add time column
132
+ df["time"] = df_time
133
+
134
+ # Retrieve raw_drop_concentration
135
+ df["raw_drop_concentration"] = df_to_parse.iloc[:, 35:67].apply(
136
+ lambda x: ",".join(x.dropna().astype(str)),
137
+ axis=1,
138
+ )
139
+ # Retrieve raw_drop_average_velocity
140
+ df["raw_drop_average_velocity"] = df_to_parse.iloc[:, 67:99].apply(
141
+ lambda x: ",".join(x.dropna().astype(str)),
142
+ axis=1,
143
+ )
144
+
145
+ # Retrieve raw_drop_number
146
+ df_raw_drop_number = df_to_parse.iloc[:, 99].squeeze()
147
+ df_raw_drop_number = df_raw_drop_number.str.replace(r"(\w{3})", r"\1,", regex=True)
148
+ df["raw_drop_number"] = df_raw_drop_number
149
+
150
+ # Drop columns not agreeing with DISDRODB L0 standards
151
+ columns_to_drop = [
152
+ "firmware_iop",
153
+ "firmware_dsp",
154
+ "sensor_time_measurement_start",
155
+ "sensor_time",
156
+ "sensor_date",
157
+ "station_name",
158
+ "station_number",
159
+ "sensor_serial_number",
160
+ "sensor_serial_number",
161
+ # "number_particles_all_detected",
162
+ ]
163
+ df = df.drop(columns=columns_to_drop)
164
+
165
+ # Return the dataframe adhering to DISDRODB L0 standards
166
+ return df
@@ -16,28 +16,25 @@
16
16
  # You should have received a copy of the GNU General Public License
17
17
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
18
18
  # -----------------------------------------------------------------------------.
19
- from disdrodb.l0 import run_l0a
19
+ import pandas as pd
20
+
20
21
  from disdrodb.l0.l0_reader import is_documented_by, reader_generic_docstring
22
+ from disdrodb.l0.l0a_processing import read_raw_text_file
21
23
 
22
24
 
23
25
  @is_documented_by(reader_generic_docstring)
24
26
  def reader(
25
- raw_dir,
26
- processed_dir,
27
- station_name,
28
- # Processing options
29
- force=False,
30
- verbose=False,
31
- parallel=False,
32
- debugging_mode=False,
27
+ filepath,
28
+ logger=None,
33
29
  ):
30
+ """Reader."""
34
31
  ##------------------------------------------------------------------------.
35
- #### - Define column names
32
+ #### Define column names
36
33
  column_names = [
37
34
  "date",
38
35
  "time",
39
36
  "sensor_status",
40
- "interval",
37
+ "sample_interval",
41
38
  "n1",
42
39
  "n2",
43
40
  "n3",
@@ -64,7 +61,7 @@ def reader(
64
61
  ]
65
62
 
66
63
  ##------------------------------------------------------------------------.
67
- #### - Define reader options
64
+ #### Define reader options
68
65
  reader_kwargs = {}
69
66
  # - Define delimiter
70
67
  reader_kwargs["delimiter"] = "\\t"
@@ -86,59 +83,38 @@ def reader(
86
83
  # - Available: gzip, bz2, zip
87
84
  reader_kwargs["compression"] = "infer"
88
85
  # - Strings to recognize as NA/NaN and replace with standard NA flags
89
- # - Already included: ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,
90
- # ‘-NaN’, ‘-nan’, 1.#IND’, 1.#QNAN’, ‘<NA>’, N/A’,
91
- # NA’, NULL’, NaN’, n/a’, nan’, null
86
+ # - Already included: '#N/A', '#N/A N/A', '#NA', '-1.#IND', '-1.#QNAN',
87
+ # '-NaN', '-nan', '1.#IND', '1.#QNAN', '<NA>', 'N/A',
88
+ # 'NA', 'NULL', 'NaN', 'n/a', 'nan', 'null'
92
89
  reader_kwargs["na_values"] = ["na", "", "error"]
93
90
 
94
91
  ##------------------------------------------------------------------------.
95
- #### - Define dataframe sanitizer function for L0 processing
96
- def df_sanitizer_fun(df):
97
- # - Import pandas
98
- import pandas as pd
99
-
100
- # - Replace 'status' NaN with 0
101
- df["sensor_status"] = df["sensor_status"].fillna(0)
102
-
103
- # - Replace all ',' with '.' in RI, RA, RAT
104
- df["RI"] = df["RI"].replace({",": "."}, regex=True)
105
- df["RA"] = df["RA"].replace({",": "."}, regex=True)
106
- df["RAT"] = df["RAT"].replace({",": "."}, regex=True)
107
-
108
- # - Define 'time' datetime column
109
- df["time"] = df["date"].astype(str) + " " + df["time"].astype(str)
110
- df["time"] = pd.to_datetime(df["time"], format="%Y-%m-%d %H:%M:%S", errors="coerce")
111
- df = df.drop(columns=["date"])
92
+ #### Read the data
93
+ df = read_raw_text_file(
94
+ filepath=filepath,
95
+ column_names=column_names,
96
+ reader_kwargs=reader_kwargs,
97
+ logger=logger,
98
+ )
112
99
 
113
- # - Create raw_drop_number column
114
- bin_columns = ["n" + str(i) for i in range(1, 21)]
115
- df_arr = df[bin_columns]
116
- df_raw_drop_number = df_arr.agg(";".join, axis=1)
117
- df["raw_drop_number"] = df_raw_drop_number
100
+ ##------------------------------------------------------------------------.
101
+ #### Adapt the dataframe to adhere to DISDRODB L0 standards
102
+ # Replace 'status' NaN with 0
103
+ df["sensor_status"] = df["sensor_status"].astype(float).fillna(value=0).astype(int)
118
104
 
119
- # - Remove bins columns
120
- df = df.drop(columns=bin_columns)
105
+ # Define 'time' datetime column
106
+ df["time"] = df["date"].astype(str) + " " + df["time"].astype(str)
107
+ df["time"] = pd.to_datetime(df["time"], format="%Y-%m-%d %H:%M:%S", errors="coerce")
108
+ df = df.drop(columns=["date"])
121
109
 
122
- return df
110
+ # Create raw_drop_number column
111
+ bin_columns = ["n" + str(i) for i in range(1, 21)]
112
+ df_arr = df[bin_columns]
113
+ df_raw_drop_number = df_arr.agg(";".join, axis=1)
114
+ df["raw_drop_number"] = df_raw_drop_number
123
115
 
124
- ##------------------------------------------------------------------------.
125
- #### - Define glob pattern to search data files in <raw_dir>/data/<station_name>
126
- glob_patterns = "*.txt"
116
+ # Remove bins columns
117
+ df = df.drop(columns=bin_columns)
127
118
 
128
- ####----------------------------------------------------------------------.
129
- #### - Create L0A products
130
- run_l0a(
131
- raw_dir=raw_dir,
132
- processed_dir=processed_dir,
133
- station_name=station_name,
134
- # Custom arguments of the reader for L0A processing
135
- glob_patterns=glob_patterns,
136
- column_names=column_names,
137
- reader_kwargs=reader_kwargs,
138
- df_sanitizer_fun=df_sanitizer_fun,
139
- # Processing options
140
- force=force,
141
- verbose=verbose,
142
- parallel=parallel,
143
- debugging_mode=debugging_mode,
144
- )
119
+ # Return the dataframe adhering to DISDRODB L0 standards
120
+ return df
@@ -16,28 +16,25 @@
16
16
  # You should have received a copy of the GNU General Public License
17
17
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
18
18
  # -----------------------------------------------------------------------------.
19
- from disdrodb.l0 import run_l0a
19
+ import pandas as pd
20
+
20
21
  from disdrodb.l0.l0_reader import is_documented_by, reader_generic_docstring
22
+ from disdrodb.l0.l0a_processing import read_raw_text_file
21
23
 
22
24
 
23
25
  @is_documented_by(reader_generic_docstring)
24
26
  def reader(
25
- raw_dir,
26
- processed_dir,
27
- station_name,
28
- # Processing options
29
- force=False,
30
- verbose=False,
31
- parallel=False,
32
- debugging_mode=False,
27
+ filepath,
28
+ logger=None,
33
29
  ):
30
+ """Reader."""
34
31
  ##------------------------------------------------------------------------.
35
- #### - Define column names
32
+ #### Define column names
36
33
  column_names = [
37
34
  "date",
38
35
  "time",
39
36
  "sensor_status",
40
- "interval",
37
+ "sample_interval",
41
38
  "n1",
42
39
  "n2",
43
40
  "n3",
@@ -64,7 +61,7 @@ def reader(
64
61
  ]
65
62
 
66
63
  ##------------------------------------------------------------------------.
67
- #### - Define reader options
64
+ #### Define reader options
68
65
  reader_kwargs = {}
69
66
  # - Define delimiter
70
67
  reader_kwargs["delimiter"] = "\\t"
@@ -86,54 +83,38 @@ def reader(
86
83
  # - Available: gzip, bz2, zip
87
84
  reader_kwargs["compression"] = "infer"
88
85
  # - Strings to recognize as NA/NaN and replace with standard NA flags
89
- # - Already included: ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,
90
- # ‘-NaN’, ‘-nan’, 1.#IND’, 1.#QNAN’, ‘<NA>’, N/A’,
91
- # NA’, NULL’, NaN’, n/a’, nan’, null
86
+ # - Already included: '#N/A', '#N/A N/A', '#NA', '-1.#IND', '-1.#QNAN',
87
+ # '-NaN', '-nan', '1.#IND', '1.#QNAN', '<NA>', 'N/A',
88
+ # 'NA', 'NULL', 'NaN', 'n/a', 'nan', 'null'
92
89
  reader_kwargs["na_values"] = ["na", "", "error"]
93
90
 
94
91
  ##------------------------------------------------------------------------.
95
- #### - Define dataframe sanitizer function for L0 processing
96
- def df_sanitizer_fun(df):
97
- # - Import pandas
98
- import pandas as pd
99
-
100
- # - Replace 'status' NaN with 0
101
- df["sensor_status"] = df["sensor_status"].fillna(0)
102
-
103
- # - Define 'time' datetime column
104
- df["time"] = df["date"].astype(str) + " " + df["time"].astype(str)
105
- df["time"] = pd.to_datetime(df["time"], format="%Y-%m-%d %H:%M:%S", errors="coerce")
106
- df = df.drop(columns=["date"])
92
+ #### Read the data
93
+ df = read_raw_text_file(
94
+ filepath=filepath,
95
+ column_names=column_names,
96
+ reader_kwargs=reader_kwargs,
97
+ logger=logger,
98
+ )
107
99
 
108
- # - Create raw_drop_number column
109
- bin_columns = ["n" + str(i) for i in range(1, 21)]
110
- df_arr = df[bin_columns]
111
- df_raw_drop_number = df_arr.agg(";".join, axis=1)
112
- df["raw_drop_number"] = df_raw_drop_number
100
+ ##------------------------------------------------------------------------.
101
+ #### Adapt the dataframe to adhere to DISDRODB L0 standards
102
+ # Replace 'status' NaN with 0
103
+ df["sensor_status"] = df["sensor_status"].astype(float).fillna(value=0).astype(int)
113
104
 
114
- # - Remove bins columns
115
- df = df.drop(columns=bin_columns)
105
+ # Define 'time' datetime column
106
+ df["time"] = df["date"].astype(str) + " " + df["time"].astype(str)
107
+ df["time"] = pd.to_datetime(df["time"], format="%Y-%m-%d %H:%M:%S", errors="coerce")
108
+ df = df.drop(columns=["date"])
116
109
 
117
- return df
110
+ # Create raw_drop_number column
111
+ bin_columns = ["n" + str(i) for i in range(1, 21)]
112
+ df_arr = df[bin_columns]
113
+ df_raw_drop_number = df_arr.agg(";".join, axis=1)
114
+ df["raw_drop_number"] = df_raw_drop_number
118
115
 
119
- ##------------------------------------------------------------------------.
120
- #### - Define glob pattern to search data files in <raw_dir>/data/<station_name>
121
- glob_patterns = "*/*/DISL*" # <year>/<month>
116
+ # Remove bins columns
117
+ df = df.drop(columns=bin_columns)
122
118
 
123
- ####----------------------------------------------------------------------.
124
- #### - Create L0A products
125
- run_l0a(
126
- raw_dir=raw_dir,
127
- processed_dir=processed_dir,
128
- station_name=station_name,
129
- # Custom arguments of the reader for L0A processing
130
- glob_patterns=glob_patterns,
131
- column_names=column_names,
132
- reader_kwargs=reader_kwargs,
133
- df_sanitizer_fun=df_sanitizer_fun,
134
- # Processing options
135
- force=force,
136
- verbose=verbose,
137
- parallel=parallel,
138
- debugging_mode=debugging_mode,
139
- )
119
+ # Return the dataframe adhering to DISDRODB L0 standards
120
+ return df
@@ -16,23 +16,20 @@
16
16
  # You should have received a copy of the GNU General Public License
17
17
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
18
18
  # -----------------------------------------------------------------------------.
19
- from disdrodb.l0 import run_l0a
19
+ import pandas as pd
20
+
20
21
  from disdrodb.l0.l0_reader import is_documented_by, reader_generic_docstring
22
+ from disdrodb.l0.l0a_processing import read_raw_text_file
21
23
 
22
24
 
23
25
  @is_documented_by(reader_generic_docstring)
24
26
  def reader(
25
- raw_dir,
26
- processed_dir,
27
- station_name,
28
- # Processing options
29
- force=False,
30
- verbose=False,
31
- parallel=False,
32
- debugging_mode=False,
27
+ filepath,
28
+ logger=None,
33
29
  ):
30
+ """Reader."""
34
31
  ##------------------------------------------------------------------------.
35
- #### - Define column names
32
+ #### Define column names
36
33
  column_names = [
37
34
  "date",
38
35
  "time",
@@ -67,7 +64,7 @@ def reader(
67
64
  ]
68
65
 
69
66
  ##------------------------------------------------------------------------.
70
- #### - Define reader options
67
+ #### Define reader options
71
68
  reader_kwargs = {}
72
69
  # - Define delimiter
73
70
  reader_kwargs["delimiter"] = "\\t"
@@ -89,54 +86,38 @@ def reader(
89
86
  # - Available: gzip, bz2, zip
90
87
  reader_kwargs["compression"] = "infer"
91
88
  # - Strings to recognize as NA/NaN and replace with standard NA flags
92
- # - Already included: ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,
93
- # ‘-NaN’, ‘-nan’, 1.#IND’, 1.#QNAN’, ‘<NA>’, N/A’,
94
- # NA’, NULL’, NaN’, n/a’, nan’, null
89
+ # - Already included: '#N/A', '#N/A N/A', '#NA', '-1.#IND', '-1.#QNAN',
90
+ # '-NaN', '-nan', '1.#IND', '1.#QNAN', '<NA>', 'N/A',
91
+ # 'NA', 'NULL', 'NaN', 'n/a', 'nan', 'null'
95
92
  reader_kwargs["na_values"] = ["na", "", "error"]
96
93
 
97
94
  ##------------------------------------------------------------------------.
98
- #### - Define dataframe sanitizer function for L0 processing
99
- def df_sanitizer_fun(df):
100
- # - Import pandas
101
- import pandas as pd
102
-
103
- # - Replace 'Z' -Inf with NaN
104
- df["Z"] = df["Z"].str.replace("-Inf", "NaN")
105
-
106
- # - Define 'time' datetime column
107
- df["time"] = df["date"].astype(str) + " " + df["time"].astype(str)
108
- df["time"] = pd.to_datetime(df["time"], format="%Y-%m-%d %H:%M:%S", errors="coerce")
109
- df = df.drop(columns=["date"])
95
+ #### Read the data
96
+ df = read_raw_text_file(
97
+ filepath=filepath,
98
+ column_names=column_names,
99
+ reader_kwargs=reader_kwargs,
100
+ logger=logger,
101
+ )
110
102
 
111
- # - Create raw_drop_number column
112
- bin_columns = ["n" + str(i) for i in range(1, 21)]
113
- df_arr = df[bin_columns]
114
- df_raw_drop_number = df_arr.agg(";".join, axis=1)
115
- df["raw_drop_number"] = df_raw_drop_number
103
+ ##------------------------------------------------------------------------.
104
+ #### Adapt the dataframe to adhere to DISDRODB L0 standards
105
+ # Replace 'Z' -Inf with NaN
106
+ df["Z"] = df["Z"].str.replace("-Inf", "NaN")
116
107
 
117
- # - Remove bins columns
118
- df = df.drop(columns=bin_columns)
108
+ # Define 'time' datetime column
109
+ df["time"] = df["date"].astype(str) + " " + df["time"].astype(str)
110
+ df["time"] = pd.to_datetime(df["time"], format="%Y-%m-%d %H:%M:%S", errors="coerce")
111
+ df = df.drop(columns=["date"])
119
112
 
120
- return df
113
+ # Create raw_drop_number column
114
+ bin_columns = ["n" + str(i) for i in range(1, 21)]
115
+ df_arr = df[bin_columns]
116
+ df_raw_drop_number = df_arr.agg(";".join, axis=1)
117
+ df["raw_drop_number"] = df_raw_drop_number
121
118
 
122
- ##------------------------------------------------------------------------.
123
- #### - Define glob pattern to search data files in <raw_dir>/data/<station_name>
124
- glob_patterns = "*.txt"
119
+ # Remove bins columns
120
+ df = df.drop(columns=bin_columns)
125
121
 
126
- ####----------------------------------------------------------------------.
127
- #### - Create L0A products
128
- run_l0a(
129
- raw_dir=raw_dir,
130
- processed_dir=processed_dir,
131
- station_name=station_name,
132
- # Custom arguments of the reader for L0A processing
133
- glob_patterns=glob_patterns,
134
- column_names=column_names,
135
- reader_kwargs=reader_kwargs,
136
- df_sanitizer_fun=df_sanitizer_fun,
137
- # Processing options
138
- force=force,
139
- verbose=verbose,
140
- parallel=parallel,
141
- debugging_mode=debugging_mode,
142
- )
122
+ # Return the dataframe adhering to DISDRODB L0 standards
123
+ return df