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,133 +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
-
43
- # Skip first row as columns names
44
- reader_kwargs["header"] = None
45
-
46
- # - Avoid first column to become df index !!!
47
- reader_kwargs["index_col"] = False
48
-
49
- # - Define behaviour when encountering bad lines
50
- reader_kwargs["on_bad_lines"] = "skip"
51
-
52
- # - Define encoding
53
- reader_kwargs["encoding"] = "ISO-8859-1"
54
-
55
- # - Define reader engine
56
- # - C engine is faster
57
- # - Python engine is more feature-complete
58
- reader_kwargs["engine"] = "python"
59
-
60
- # - Define on-the-fly decompression of on-disk data
61
- # - Available: gzip, bz2, zip
62
- reader_kwargs["compression"] = "infer"
63
-
64
- # - Strings to recognize as NA/NaN and replace with standard NA flags
65
- # - Already included: ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,
66
- # ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘<NA>’, ‘N/A’,
67
- # ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’
68
- reader_kwargs["na_values"] = ["na", "", "error"]
69
-
70
- ##------------------------------------------------------------------------.
71
- #### - Define dataframe sanitizer function for L0 processing
72
-
73
- def df_sanitizer_fun(df):
74
- # - Import pandas
75
- import pandas as pd
76
-
77
- # - Retrieve file start time (date hour:minute)
78
- start_time = df["TO_PARSE"].iloc[0]
79
- start_time = start_time[0:16]
80
- start_time = pd.to_datetime(start_time, format="%m/%d/%Y %H:%M", errors="coerce")
81
- df = df.iloc[1:] # remove start_time row
82
-
83
- # - Replace heterogeneous number of spaces with ;
84
- df["TO_PARSE"] = df["TO_PARSE"].str.replace(r" +", ";", regex=True)
85
-
86
- # - Split into columns and assign name
87
- df = df["TO_PARSE"].str.split(";", expand=True)
88
- columns = [
89
- "MMSSmmm",
90
- "rainfall_rate_32bit",
91
- "rainfall_accumulated_32bit",
92
- "reflectivity_32bit",
93
- "number_particles",
94
- "sensor_status",
95
- "error_code",
96
- "raw_drop_concentration",
97
- "raw_drop_average_velocity",
98
- "raw_drop_number",
99
- ]
100
- df.columns = columns
101
-
102
- # - Define datetime 'time' column
103
- dt_minute = df["MMSSmmm"].str[0:2].astype(int).astype("<m8[m]")
104
- dt_second = df["MMSSmmm"].str[2:4].astype(int).astype("<m8[s]")
105
- df_time = start_time + dt_minute + dt_second
106
- df["time"] = df_time
107
-
108
- # - Drop columns not agreeing with DISDRODB L0 standards
109
- df = df.drop(columns=["MMSSmmm"])
110
-
111
- return df
112
-
113
- ##------------------------------------------------------------------------.
114
- #### - Define glob pattern to search data files in <raw_dir>/data/<station_name>
115
- glob_patterns = "*.txt"
116
-
117
- ####----------------------------------------------------------------------.
118
- #### - Create L0A products
119
- run_l0a(
120
- raw_dir=raw_dir,
121
- processed_dir=processed_dir,
122
- station_name=station_name,
123
- # Custom arguments of the reader for L0A processing
124
- glob_patterns=glob_patterns,
125
- column_names=column_names,
126
- reader_kwargs=reader_kwargs,
127
- df_sanitizer_fun=df_sanitizer_fun,
128
- # Processing options
129
- force=force,
130
- verbose=verbose,
131
- parallel=parallel,
132
- debugging_mode=debugging_mode,
133
- )
@@ -1,137 +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_SPLIT"]
36
-
37
- ##------------------------------------------------------------------------.
38
- #### - Define reader options
39
- reader_kwargs = {}
40
-
41
- # - Define delimiter
42
- reader_kwargs["delimiter"] = "\\n"
43
-
44
- # - Avoid first column to become df index !!!
45
- reader_kwargs["index_col"] = False
46
-
47
- # - Skip first row as columns names
48
- reader_kwargs["header"] = None
49
-
50
- # - Define encoding
51
- reader_kwargs["encoding"] = "latin1"
52
-
53
- # - Define behaviour when encountering bad lines
54
- reader_kwargs["on_bad_lines"] = "skip"
55
-
56
- # - Define reader engine
57
- # - C engine is faster
58
- # - Python engine is more feature-complete
59
- reader_kwargs["engine"] = "python"
60
-
61
- # - Strings to recognize as NA/NaN and replace with standard NA flags
62
- # - Already included: ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,
63
- # ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘<NA>’, ‘N/A’,
64
- # ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’
65
- reader_kwargs["na_values"] = ["na", "error", "-.-", " NA"]
66
-
67
- ##------------------------------------------------------------------------.
68
- #### - Define facultative dataframe sanitizer function for L0 processing
69
- def df_sanitizer_fun(df):
70
- import pandas as pd
71
-
72
- # Remove repeated headers (with length 333)
73
- df = df[df["TO_SPLIT"].str.len() != 333]
74
-
75
- # Split into columns and assign name
76
- df = df["TO_SPLIT"].str.split(",", expand=True, n=15)
77
- columns = [
78
- "date",
79
- "time",
80
- "rainfall_rate_32bit",
81
- "rainfall_accumulated_32bit",
82
- "weather_code_synop_4680",
83
- "weather_code_metar_4678",
84
- "weather_code_nws",
85
- "reflectivity_32bit",
86
- "mor_visibility",
87
- "laser_amplitude",
88
- "number_particles",
89
- "sensor_temperature",
90
- "sensor_heating_current",
91
- "sensor_battery_voltage",
92
- "rain_kinetic_energy",
93
- "raw_drop_number",
94
- ]
95
- df.columns = columns
96
-
97
- # Add datetime time column
98
- df["time"] = df["date"] + "-" + df["time"]
99
- df["time"] = pd.to_datetime(df["time"], format="%Y.%m.%d-%H:%M:%S", errors="coerce")
100
- df = df.drop(columns=["date"])
101
-
102
- # Preprocess the raw spectrum
103
- # - The '<SPECTRUM>ZERO</SPECTRUM>' indicates no drops detected
104
- # --> "" generates an array of zeros in L0B processing
105
- df["raw_drop_number"] = df["raw_drop_number"].replace("<SPECTRUM>ZERO</SPECTRUM>", "")
106
-
107
- # Remove <SPECTRUM> and </SPECTRUM>" acronyms from the raw_drop_number field
108
- df["raw_drop_number"] = df["raw_drop_number"].str.replace("<SPECTRUM>", "")
109
- df["raw_drop_number"] = df["raw_drop_number"].str.replace("</SPECTRUM>", "")
110
-
111
- # Add 0 before every , if , not preceded by a digit
112
- # Example: ',,1,,' --> '0,0,1,0,'
113
- df["raw_drop_number"] = df["raw_drop_number"].str.replace(r"(?<!\d),", "0,", regex=True)
114
-
115
- return df
116
-
117
- ##------------------------------------------------------------------------.
118
- #### - Define glob pattern to search data files in raw_dir/data/<station_name>
119
- glob_patterns = "*.MIS"
120
-
121
- ####----------------------------------------------------------------------.
122
- #### - Create L0A products
123
- run_l0a(
124
- raw_dir=raw_dir,
125
- processed_dir=processed_dir,
126
- station_name=station_name,
127
- # Custom arguments of the reader for L0A processing
128
- glob_patterns=glob_patterns,
129
- column_names=column_names,
130
- reader_kwargs=reader_kwargs,
131
- df_sanitizer_fun=df_sanitizer_fun,
132
- # Processing options
133
- force=force,
134
- verbose=verbose,
135
- parallel=parallel,
136
- debugging_mode=debugging_mode,
137
- )
@@ -1,144 +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_SPLIT"]
36
-
37
- ##------------------------------------------------------------------------.
38
- #### - Define reader options
39
- reader_kwargs = {}
40
-
41
- # - Define delimiter
42
- reader_kwargs["delimiter"] = "\\n"
43
-
44
- # - Skip first row as columns names
45
- reader_kwargs["header"] = None
46
-
47
- # - Skip header
48
- reader_kwargs["skiprows"] = 7
49
-
50
- # - Define encoding
51
- reader_kwargs["encoding"] = "ISO-8859-1"
52
-
53
- # - Avoid first column to become df index !!!
54
- reader_kwargs["index_col"] = False
55
-
56
- # - Define behaviour when encountering bad lines
57
- reader_kwargs["on_bad_lines"] = "skip"
58
-
59
- # - Define reader engine
60
- # - C engine is faster
61
- # - Python engine is more feature-complete
62
- reader_kwargs["engine"] = "python"
63
-
64
- # - Define on-the-fly decompression of on-disk data
65
- # - Available: gzip, bz2, zip
66
- # reader_kwargs['compression'] = 'xz'
67
-
68
- # - Strings to recognize as NA/NaN and replace with standard NA flags
69
- # - Already included: ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,
70
- # ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘<NA>’, ‘N/A’,
71
- # ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’
72
- reader_kwargs["na_values"] = ["na", "error", "-.-", " NA"]
73
-
74
- ##------------------------------------------------------------------------.
75
- #### - Define facultative dataframe sanitizer function for L0 processing
76
- def df_sanitizer_fun(df):
77
- # Import pandas
78
- import pandas as pd
79
-
80
- # Remove repeated headers (with length 301)
81
- df = df[df["TO_SPLIT"].str.len() != 301]
82
-
83
- # Split into columns and assign name
84
- df = df["TO_SPLIT"].str.split(",", expand=True, n=14)
85
- columns = [
86
- "date",
87
- "time",
88
- "rainfall_rate_32bit",
89
- "rainfall_accumulated_32bit",
90
- "weather_code_synop_4680",
91
- "reflectivity_32bit",
92
- "mor_visibility",
93
- "laser_amplitude",
94
- "sensor_temperature",
95
- "weather_code_metar_4678",
96
- "weather_code_nws",
97
- "number_particles",
98
- "sensor_heating_current",
99
- "sensor_battery_voltage",
100
- "raw_drop_number",
101
- ]
102
- df.columns = columns
103
-
104
- # Add datetime time column
105
- df["time"] = df["date"] + "-" + df["time"]
106
- df["time"] = pd.to_datetime(df["time"], format="%d.%m.%Y-%H:%M:%S", errors="coerce")
107
- df = df.drop(columns=["date"])
108
-
109
- # Preprocess the raw spectrum
110
- # - The '<SPECTRUM>ZERO</SPECTRUM>' indicates no drops detected
111
- # --> "" generates an array of zeros in L0B processing
112
- df["raw_drop_number"] = df["raw_drop_number"].replace("<SPECTRUM>ZERO</SPECTRUM>", "")
113
-
114
- # Remove <SPECTRUM> and </SPECTRUM>" acronyms from the raw_drop_number field
115
- df["raw_drop_number"] = df["raw_drop_number"].str.replace("<SPECTRUM>", "")
116
- df["raw_drop_number"] = df["raw_drop_number"].str.replace("</SPECTRUM>", "")
117
-
118
- # Add 0 before every , if , not preceded by a digit
119
- # Example: ',,1,,' --> '0,0,1,0,'
120
- df["raw_drop_number"] = df["raw_drop_number"].str.replace(r"(?<!\d),", "0,", regex=True)
121
-
122
- return df
123
-
124
- ##------------------------------------------------------------------------.
125
- #### - Define glob pattern to search data files in raw_dir/data/<station_name>
126
- glob_patterns = "*.dat*"
127
-
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
- )
@@ -1,195 +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
-
41
- # - Define delimiter
42
- reader_kwargs["delimiter"] = "\\n"
43
-
44
- # - Define encoding
45
- reader_kwargs["encoding"] = "ISO-8859-1"
46
-
47
- # Skip first row as columns names
48
- reader_kwargs["header"] = None
49
-
50
- # - Avoid first column to become df index !!!
51
- reader_kwargs["index_col"] = False
52
-
53
- # - Define behaviour when encountering bad lines
54
- reader_kwargs["on_bad_lines"] = "skip"
55
-
56
- # - Define reader engine
57
- # - C engine is faster
58
- # - Python engine is more feature-complete
59
- reader_kwargs["engine"] = "python"
60
-
61
- # - Define on-the-fly decompression of on-disk data
62
- # - Available: gzip, bz2, zip
63
- reader_kwargs["compression"] = "infer"
64
-
65
- # - Strings to recognize as NA/NaN and replace with standard NA flags
66
- # - Already included: ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,
67
- # ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘<NA>’, ‘N/A’,
68
- # ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’
69
- reader_kwargs["na_values"] = ["na", "", "error"]
70
-
71
- ##------------------------------------------------------------------------.
72
- #### - Define facultative dataframe sanitizer function for L0 processing
73
-
74
- def df_sanitizer_fun(df):
75
- # Import pandas and numpy
76
- import numpy as np
77
- import pandas as pd
78
-
79
- # Create ID and Value columns
80
- df = df["TO_PARSE"].str.split(":", expand=True, n=1)
81
- df.columns = ["ID", "Value"]
82
-
83
- # Drop rows with no values
84
- df = df[df["Value"].astype(bool)]
85
-
86
- # Create the dataframe with each row corresponding to a timestep
87
- # - Group rows based on when ID values restart
88
- groups = df.groupby((df["ID"].astype(int).diff() <= 0).cumsum())
89
-
90
- # - Reshape the dataframe
91
- group_dfs = []
92
- for _, group in groups:
93
- group_df = group.set_index("ID").T
94
- group_dfs.append(group_df)
95
-
96
- # - Merge each timestep dataframe
97
- # --> Missing columns are infilled by NaN
98
- df = pd.concat(group_dfs, axis=0)
99
- df.columns = df.columns.astype(str).str.pad(width=2, side="left", fillchar="0")
100
-
101
- # Assign column names
102
- column_dict = {
103
- "01": "rainfall_rate_32bit",
104
- "02": "rainfall_accumulated_32bit",
105
- "03": "weather_code_synop_4680",
106
- "04": "weather_code_synop_4677",
107
- "05": "weather_code_metar_4678",
108
- "06": "weather_code_nws",
109
- "07": "reflectivity_32bit",
110
- "08": "mor_visibility",
111
- "09": "sample_interval",
112
- "10": "laser_amplitude",
113
- "11": "number_particles",
114
- "12": "sensor_temperature",
115
- # "13": "sensor_serial_number",
116
- # "14": "firmware_iop",
117
- # "15": "firmware_dsp",
118
- "16": "sensor_heating_current",
119
- "17": "sensor_battery_voltage",
120
- "18": "sensor_status",
121
- # "19": "start_time",
122
- "20": "sensor_time",
123
- "21": "sensor_date",
124
- # "22": "station_name",
125
- # "23": "station_number",
126
- "24": "rainfall_amount_absolute_32bit",
127
- "25": "error_code",
128
- "26": "sensor_temperature_pcb",
129
- "27": "sensor_temperature_receiver",
130
- "28": "sensor_temperature_trasmitter",
131
- "30": "rainfall_rate_16_bit_30",
132
- "31": "rainfall_rate_16_bit_1200",
133
- "32": "rainfall_accumulated_16bit",
134
- "33": "reflectivity_16bit",
135
- "34": "rain_kinetic_energy",
136
- "35": "snowfall_rate",
137
- # 60: "number_particles_all",
138
- # 61: "list_particles",
139
- "90": "raw_drop_concentration",
140
- "91": "raw_drop_average_velocity",
141
- "93": "raw_drop_number",
142
- }
143
-
144
- # Identify missing columns and add NaN
145
- expected_columns = np.array(list(column_dict.keys()))
146
- missing_columns = expected_columns[np.isin(expected_columns, df.columns, invert=True)].tolist()
147
- if len(missing_columns) > 0:
148
- for column in missing_columns:
149
- df[column] = "NaN"
150
-
151
- # Rename columns
152
- df = df.rename(column_dict, axis=1)
153
-
154
- # - Keep only columns defined in the dictionary
155
- df = df[list(column_dict.values())]
156
-
157
- # - Define datetime "time" column
158
- df["time"] = df["sensor_date"] + "-" + df["sensor_time"]
159
- df["time"] = pd.to_datetime(df["time"], format="%d.%m.%Y-%H:%M:%S", errors="coerce")
160
-
161
- # - Drop columns not agreeing with DISDRODB L0 standards
162
- columns_to_drop = [
163
- "sensor_date",
164
- "sensor_time",
165
- # "firmware_iop",
166
- # "firmware_dsp",
167
- # "sensor_serial_number",
168
- # "station_name",
169
- # "station_number",
170
- ]
171
- df = df.drop(columns=columns_to_drop)
172
-
173
- return df
174
-
175
- ##------------------------------------------------------------------------.
176
- #### - Define glob pattern to search data files in raw_dir/data/<station_name>
177
- glob_patterns = "*" # There is only one file without extension
178
-
179
- ####----------------------------------------------------------------------.
180
- #### - Create L0A products
181
- run_l0a(
182
- raw_dir=raw_dir,
183
- processed_dir=processed_dir,
184
- station_name=station_name,
185
- # Custom arguments of the reader for L0A processing
186
- glob_patterns=glob_patterns,
187
- column_names=column_names,
188
- reader_kwargs=reader_kwargs,
189
- df_sanitizer_fun=df_sanitizer_fun,
190
- # Processing options
191
- force=force,
192
- verbose=verbose,
193
- parallel=parallel,
194
- debugging_mode=debugging_mode,
195
- )