disdrodb 0.0.21__py3-none-any.whl → 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) 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 +306 -270
  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 +46 -51
  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 +84 -65
  57. disdrodb/l0/configs/{Thies_LPM → LPM}/l0b_encodings.yml +50 -9
  58. disdrodb/l0/configs/{Thies_LPM → LPM}/raw_data_format.yml +285 -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 +23 -21
  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 +28 -26
  69. disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/l0b_encodings.yml +20 -20
  70. disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/raw_data_format.yml +107 -107
  71. disdrodb/l0/configs/PWS100/bins_diameter.yml +173 -0
  72. disdrodb/l0/configs/PWS100/bins_velocity.yml +173 -0
  73. disdrodb/l0/configs/PWS100/l0a_encodings.yml +19 -0
  74. disdrodb/l0/configs/PWS100/l0b_cf_attrs.yml +76 -0
  75. disdrodb/l0/configs/PWS100/l0b_encodings.yml +176 -0
  76. disdrodb/l0/configs/PWS100/raw_data_format.yml +182 -0
  77. disdrodb/l0/configs/{RD_80 → RD80}/bins_diameter.yml +40 -40
  78. disdrodb/l0/configs/RD80/l0a_encodings.yml +16 -0
  79. disdrodb/l0/configs/{RD_80 → RD80}/l0b_cf_attrs.yml +3 -3
  80. disdrodb/l0/configs/RD80/l0b_encodings.yml +135 -0
  81. disdrodb/l0/configs/{RD_80 → RD80}/raw_data_format.yml +46 -50
  82. disdrodb/l0/l0_reader.py +216 -340
  83. disdrodb/l0/l0a_processing.py +237 -208
  84. disdrodb/l0/l0b_nc_processing.py +227 -80
  85. disdrodb/l0/l0b_processing.py +96 -174
  86. disdrodb/l0/l0c_processing.py +627 -0
  87. disdrodb/l0/readers/{ARM → LPM/ARM}/ARM_LPM.py +36 -58
  88. disdrodb/l0/readers/LPM/AUSTRALIA/MELBOURNE_2007_LPM.py +236 -0
  89. disdrodb/l0/readers/LPM/BRAZIL/CHUVA_LPM.py +185 -0
  90. disdrodb/l0/readers/LPM/BRAZIL/GOAMAZON_LPM.py +185 -0
  91. disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +195 -0
  92. disdrodb/l0/readers/LPM/ITALY/GID_LPM_W.py +210 -0
  93. disdrodb/l0/readers/{BRAZIL/GOAMAZON_LPM.py → LPM/KIT/CHWALA.py} +97 -76
  94. disdrodb/l0/readers/LPM/SLOVENIA/ARSO.py +197 -0
  95. disdrodb/l0/readers/LPM/SLOVENIA/CRNI_VRH.py +197 -0
  96. disdrodb/l0/readers/{UK → LPM/UK}/DIVEN.py +14 -35
  97. disdrodb/l0/readers/PARSIVEL/AUSTRALIA/MELBOURNE_2007_PARSIVEL.py +157 -0
  98. disdrodb/l0/readers/PARSIVEL/CHINA/CHONGQING.py +113 -0
  99. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/ARCTIC_2021.py +40 -57
  100. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/COMMON_2011.py +37 -54
  101. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/DAVOS_2009_2011.py +34 -51
  102. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/EPFL_2009.py +34 -51
  103. disdrodb/l0/readers/{EPFL/PARADISO_2014.py → PARSIVEL/EPFL/EPFL_ROOF_2008.py} +38 -50
  104. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2010.py +105 -0
  105. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/EPFL_ROOF_2011.py +34 -51
  106. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/EPFL_ROOF_2012.py +33 -51
  107. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/GENEPI_2007.py +25 -44
  108. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/GRAND_ST_BERNARD_2007.py +25 -44
  109. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/GRAND_ST_BERNARD_2007_2.py +25 -44
  110. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/HPICONET_2010.py +34 -51
  111. disdrodb/l0/readers/{EPFL/EPFL_ROOF_2010.py → PARSIVEL/EPFL/HYMEX_LTE_SOP2.py} +37 -50
  112. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP3.py +111 -0
  113. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/HYMEX_LTE_SOP4.py +36 -54
  114. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/LOCARNO_2018.py +34 -52
  115. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/LOCARNO_2019.py +38 -56
  116. disdrodb/l0/readers/PARSIVEL/EPFL/PARADISO_2014.py +105 -0
  117. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/PARSIVEL_2007.py +27 -45
  118. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/PLATO_2019.py +24 -44
  119. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019.py +140 -0
  120. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/RACLETS_2019_WJF.py +41 -59
  121. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/RIETHOLZBACH_2011.py +34 -51
  122. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2017.py +117 -0
  123. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2019.py +137 -0
  124. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/UNIL_2022.py +42 -55
  125. disdrodb/l0/readers/PARSIVEL/GPM/IFLOODS.py +104 -0
  126. disdrodb/l0/readers/{GPM → PARSIVEL/GPM}/LPVEX.py +29 -48
  127. disdrodb/l0/readers/PARSIVEL/GPM/MC3E.py +184 -0
  128. disdrodb/l0/readers/PARSIVEL/KIT/BURKINA_FASO.py +133 -0
  129. disdrodb/l0/readers/PARSIVEL/NCAR/CCOPE_2015.py +113 -0
  130. disdrodb/l0/readers/{NCAR/VORTEX_SE_2016_P1.py → PARSIVEL/NCAR/OWLES_MIPS.py} +46 -72
  131. disdrodb/l0/readers/PARSIVEL/NCAR/PECAN_MOBILE.py +125 -0
  132. disdrodb/l0/readers/{NCAR/OWLES_MIPS.py → PARSIVEL/NCAR/PLOWS_MIPS.py} +45 -64
  133. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2009.py +114 -0
  134. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010.py +176 -0
  135. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010_UF.py +183 -0
  136. disdrodb/l0/readers/PARSIVEL/SLOVENIA/UL_FGG.py +121 -0
  137. disdrodb/l0/readers/{ARM/ARM_LD.py → PARSIVEL2/ARM/ARM_PARSIVEL2.py} +27 -50
  138. disdrodb/l0/readers/PARSIVEL2/BRAZIL/CHUVA_PARSIVEL2.py +163 -0
  139. disdrodb/l0/readers/PARSIVEL2/BRAZIL/GOAMAZON_PARSIVEL2.py +163 -0
  140. disdrodb/l0/readers/{DENMARK → PARSIVEL2/DENMARK}/EROSION_nc.py +14 -35
  141. disdrodb/l0/readers/PARSIVEL2/FRANCE/ENPC_PARSIVEL2.py +189 -0
  142. disdrodb/l0/readers/PARSIVEL2/FRANCE/SIRTA_PARSIVEL2.py +119 -0
  143. disdrodb/l0/readers/PARSIVEL2/GPM/GCPEX.py +104 -0
  144. disdrodb/l0/readers/PARSIVEL2/GPM/NSSTC.py +176 -0
  145. disdrodb/l0/readers/PARSIVEL2/ITALY/GID_PARSIVEL2.py +32 -0
  146. disdrodb/l0/readers/PARSIVEL2/MEXICO/OH_IIUNAM_nc.py +56 -0
  147. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_FP3.py +120 -0
  148. disdrodb/l0/readers/{NCAR → PARSIVEL2/NCAR}/PECAN_MIPS.py +45 -64
  149. disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +181 -0
  150. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_PJ.py +160 -0
  151. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_SB.py +160 -0
  152. disdrodb/l0/readers/{NCAR/PLOWS_MIPS.py → PARSIVEL2/NCAR/VORTEX_SE_2016_P1.py} +49 -66
  153. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P2.py +118 -0
  154. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py +152 -0
  155. disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT.py +166 -0
  156. disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100.py +150 -0
  157. disdrodb/l0/readers/{NCAR/RELAMPAGO_RD80.py → RD80/BRAZIL/CHUVA_RD80.py} +36 -60
  158. disdrodb/l0/readers/{BRAZIL → RD80/BRAZIL}/GOAMAZON_RD80.py +36 -55
  159. disdrodb/l0/readers/{NCAR → RD80/NCAR}/CINDY_2011_RD80.py +35 -54
  160. disdrodb/l0/readers/{BRAZIL/CHUVA_RD80.py → RD80/NCAR/RELAMPAGO_RD80.py} +40 -54
  161. disdrodb/l0/readers/RD80/NOAA/PSL_RD80.py +274 -0
  162. disdrodb/l0/readers/template_reader_raw_netcdf_data.py +62 -0
  163. disdrodb/l0/readers/{reader_template.py → template_reader_raw_text_data.py} +20 -44
  164. disdrodb/l0/routines.py +885 -581
  165. disdrodb/l0/standards.py +77 -238
  166. disdrodb/l0/template_tools.py +105 -110
  167. disdrodb/l1/__init__.py +17 -0
  168. disdrodb/l1/beard_model.py +716 -0
  169. disdrodb/l1/encoding_attrs.py +635 -0
  170. disdrodb/l1/fall_velocity.py +260 -0
  171. disdrodb/l1/filters.py +192 -0
  172. disdrodb/l1/processing.py +202 -0
  173. disdrodb/l1/resampling.py +236 -0
  174. disdrodb/l1/routines.py +358 -0
  175. disdrodb/l1_env/__init__.py +17 -0
  176. disdrodb/l1_env/routines.py +38 -0
  177. disdrodb/l2/__init__.py +17 -0
  178. disdrodb/l2/empirical_dsd.py +1833 -0
  179. disdrodb/l2/event.py +388 -0
  180. disdrodb/l2/processing.py +528 -0
  181. disdrodb/l2/processing_options.py +213 -0
  182. disdrodb/l2/routines.py +868 -0
  183. disdrodb/metadata/__init__.py +9 -2
  184. disdrodb/metadata/checks.py +180 -124
  185. disdrodb/metadata/download.py +81 -0
  186. disdrodb/metadata/geolocation.py +146 -0
  187. disdrodb/metadata/info.py +20 -13
  188. disdrodb/metadata/manipulation.py +3 -3
  189. disdrodb/metadata/reader.py +59 -8
  190. disdrodb/metadata/search.py +77 -144
  191. disdrodb/metadata/standards.py +83 -80
  192. disdrodb/metadata/writer.py +10 -16
  193. disdrodb/psd/__init__.py +38 -0
  194. disdrodb/psd/fitting.py +2146 -0
  195. disdrodb/psd/models.py +774 -0
  196. disdrodb/routines.py +1412 -0
  197. disdrodb/scattering/__init__.py +28 -0
  198. disdrodb/scattering/axis_ratio.py +344 -0
  199. disdrodb/scattering/routines.py +456 -0
  200. disdrodb/utils/__init__.py +17 -0
  201. disdrodb/utils/attrs.py +208 -0
  202. disdrodb/utils/cli.py +269 -0
  203. disdrodb/utils/compression.py +60 -42
  204. disdrodb/utils/dask.py +62 -0
  205. disdrodb/utils/dataframe.py +342 -0
  206. disdrodb/utils/decorators.py +110 -0
  207. disdrodb/utils/directories.py +107 -46
  208. disdrodb/utils/encoding.py +127 -0
  209. disdrodb/utils/list.py +29 -0
  210. disdrodb/utils/logger.py +168 -46
  211. disdrodb/utils/time.py +657 -0
  212. disdrodb/utils/warnings.py +30 -0
  213. disdrodb/utils/writer.py +57 -0
  214. disdrodb/utils/xarray.py +138 -47
  215. disdrodb/utils/yaml.py +0 -1
  216. disdrodb/viz/__init__.py +17 -0
  217. disdrodb/viz/plots.py +17 -0
  218. disdrodb-0.1.1.dist-info/METADATA +294 -0
  219. disdrodb-0.1.1.dist-info/RECORD +232 -0
  220. {disdrodb-0.0.21.dist-info → disdrodb-0.1.1.dist-info}/WHEEL +1 -1
  221. disdrodb-0.1.1.dist-info/entry_points.txt +30 -0
  222. disdrodb/data_transfer/scripts/disdrodb_download_archive.py +0 -53
  223. disdrodb/data_transfer/scripts/disdrodb_upload_archive.py +0 -57
  224. disdrodb/l0/configs/OTT_Parsivel/l0a_encodings.yml +0 -32
  225. disdrodb/l0/configs/OTT_Parsivel2/l0a_encodings.yml +0 -39
  226. disdrodb/l0/configs/RD_80/l0a_encodings.yml +0 -16
  227. disdrodb/l0/configs/RD_80/l0b_encodings.yml +0 -135
  228. disdrodb/l0/configs/Thies_LPM/l0a_encodings.yml +0 -80
  229. disdrodb/l0/io.py +0 -257
  230. disdrodb/l0/l0_processing.py +0 -1091
  231. disdrodb/l0/readers/AUSTRALIA/MELBOURNE_2007_OTT.py +0 -178
  232. disdrodb/l0/readers/AUSTRALIA/MELBOURNE_2007_THIES.py +0 -247
  233. disdrodb/l0/readers/BRAZIL/CHUVA_LPM.py +0 -204
  234. disdrodb/l0/readers/BRAZIL/CHUVA_OTT.py +0 -183
  235. disdrodb/l0/readers/BRAZIL/GOAMAZON_OTT.py +0 -183
  236. disdrodb/l0/readers/CHINA/CHONGQING.py +0 -131
  237. disdrodb/l0/readers/EPFL/EPFL_ROOF_2008.py +0 -128
  238. disdrodb/l0/readers/EPFL/HYMEX_LTE_SOP2.py +0 -127
  239. disdrodb/l0/readers/EPFL/HYMEX_LTE_SOP3.py +0 -129
  240. disdrodb/l0/readers/EPFL/RACLETS_2019.py +0 -158
  241. disdrodb/l0/readers/EPFL/SAMOYLOV_2017.py +0 -136
  242. disdrodb/l0/readers/EPFL/SAMOYLOV_2019.py +0 -158
  243. disdrodb/l0/readers/FRANCE/SIRTA_OTT2.py +0 -138
  244. disdrodb/l0/readers/GPM/GCPEX.py +0 -123
  245. disdrodb/l0/readers/GPM/IFLOODS.py +0 -123
  246. disdrodb/l0/readers/GPM/MC3E.py +0 -123
  247. disdrodb/l0/readers/GPM/NSSTC.py +0 -164
  248. disdrodb/l0/readers/ITALY/GID.py +0 -199
  249. disdrodb/l0/readers/MEXICO/OH_IIUNAM_nc.py +0 -92
  250. disdrodb/l0/readers/NCAR/CCOPE_2015.py +0 -133
  251. disdrodb/l0/readers/NCAR/PECAN_FP3.py +0 -137
  252. disdrodb/l0/readers/NCAR/PECAN_MOBILE.py +0 -144
  253. disdrodb/l0/readers/NCAR/RELAMPAGO_OTT.py +0 -195
  254. disdrodb/l0/readers/NCAR/SNOWIE_PJ.py +0 -172
  255. disdrodb/l0/readers/NCAR/SNOWIE_SB.py +0 -179
  256. disdrodb/l0/readers/NCAR/VORTEX2_2009.py +0 -133
  257. disdrodb/l0/readers/NCAR/VORTEX2_2010.py +0 -188
  258. disdrodb/l0/readers/NCAR/VORTEX2_2010_UF.py +0 -191
  259. disdrodb/l0/readers/NCAR/VORTEX_SE_2016_P2.py +0 -135
  260. disdrodb/l0/readers/NCAR/VORTEX_SE_2016_PIPS.py +0 -170
  261. disdrodb/l0/readers/NETHERLANDS/DELFT.py +0 -187
  262. disdrodb/l0/readers/SPAIN/SBEGUERIA.py +0 -179
  263. disdrodb/l0/scripts/disdrodb_run_l0b_concat.py +0 -93
  264. disdrodb/l0/scripts/disdrodb_run_l0b_concat_station.py +0 -85
  265. disdrodb/utils/netcdf.py +0 -452
  266. disdrodb/utils/scripts.py +0 -102
  267. disdrodb-0.0.21.dist-info/AUTHORS.md +0 -18
  268. disdrodb-0.0.21.dist-info/METADATA +0 -186
  269. disdrodb-0.0.21.dist-info/RECORD +0 -168
  270. disdrodb-0.0.21.dist-info/entry_points.txt +0 -15
  271. /disdrodb/l0/configs/{RD_80 → RD80}/bins_velocity.yml +0 -0
  272. /disdrodb/l0/manuals/{Thies_LPM.pdf → LPM.pdf} +0 -0
  273. /disdrodb/l0/manuals/{ODM_470.pdf → ODM470.pdf} +0 -0
  274. /disdrodb/l0/manuals/{OTT_Parsivel.pdf → PARSIVEL.pdf} +0 -0
  275. /disdrodb/l0/manuals/{OTT_Parsivel2.pdf → PARSIVEL2.pdf} +0 -0
  276. /disdrodb/l0/manuals/{PWS_100.pdf → PWS100.pdf} +0 -0
  277. /disdrodb/l0/manuals/{RD_80.pdf → RD80.pdf} +0 -0
  278. {disdrodb-0.0.21.dist-info → disdrodb-0.1.1.dist-info/licenses}/LICENSE +0 -0
  279. {disdrodb-0.0.21.dist-info → disdrodb-0.1.1.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,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
- )
@@ -1,131 +0,0 @@
1
- #!/usr/bin/env python3
2
-
3
- # -----------------------------------------------------------------------------.
4
- # Copyright (c) 2021-2023 DISDRODB developers
5
- #
6
- # This program is free software: you can redistribute it and/or modify
7
- # it under the terms of the GNU General Public License as published by
8
- # the Free Software Foundation, either version 3 of the License, or
9
- # (at your option) any later version.
10
- #
11
- # This program is distributed in the hope that it will be useful,
12
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- # GNU General Public License for more details.
15
- #
16
- # You should have received a copy of the GNU General Public License
17
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
18
- # -----------------------------------------------------------------------------.
19
- """Reader for CHONGQING campaign."""
20
- from disdrodb.l0 import run_l0a
21
- from disdrodb.l0.l0_reader import is_documented_by, reader_generic_docstring
22
-
23
-
24
- @is_documented_by(reader_generic_docstring)
25
- def reader(
26
- raw_dir,
27
- processed_dir,
28
- station_name,
29
- # Processing options
30
- force=False,
31
- verbose=False,
32
- parallel=False,
33
- debugging_mode=False,
34
- ):
35
- ##------------------------------------------------------------------------.
36
- #### - Define column names
37
- column_names = ["TO_SPLIT"]
38
-
39
- ##------------------------------------------------------------------------.
40
- #### - Define reader options
41
- reader_kwargs = {}
42
- reader_kwargs["delimiter"] = ","
43
- # - No header
44
- # reader_kwargs["header"] = None
45
- # - Define encoding
46
- reader_kwargs["encoding"] = "latin-1"
47
- # - Avoid first column to become df index
48
- reader_kwargs["index_col"] = False
49
- # - Define behaviour when encountering bad lines
50
- reader_kwargs["on_bad_lines"] = "skip"
51
- # - Define reader engine
52
- # - C engine is faster
53
- # - Python engine is more feature-complete
54
- reader_kwargs["engine"] = "python"
55
- # - Define on-the-fly decompression of on-disk data
56
- # - Available: gzip, bz2, zip
57
- reader_kwargs["compression"] = "infer"
58
- # - Strings to recognize as NA/NaN and replace with standard NA flags
59
- # - Already included: ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,
60
- # ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘<NA>’, ‘N/A’,
61
- # ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’
62
- reader_kwargs["na_values"] = ["na", "", "error", "-.-", "C" * 32]
63
-
64
- ##------------------------------------------------------------------------.
65
- #### - Define dataframe sanitizer function for L0 processing
66
- def df_sanitizer_fun(df):
67
- # - Import pandas
68
- import numpy as np
69
- import pandas as pd
70
-
71
- # - Drop invalid rows
72
- # --> C*32 that is nan
73
- df = df.dropna()
74
-
75
- # - Check if there are valid data
76
- if len(df) == 0:
77
- raise ValueError("No data available")
78
-
79
- # - Retrieve timesteps
80
- df_time = df["TO_SPLIT"].iloc[0::33]
81
- df_time = pd.to_datetime(df_time, format="%Y.%m.%d;%H:%M", errors="coerce")
82
- df_time = df_time.rename("time")
83
- df_time = df_time.reset_index(drop=True)
84
- # - Retrieve data
85
- idx = np.ones(len(df)).astype(bool)
86
- idx[0::33] = False
87
- df_data = df[idx]
88
-
89
- # - Check consistency (no missing rows)
90
- n_expected_data_rows = int(len(df_time) * 32)
91
- if len(df_data) != n_expected_data_rows:
92
- raise ValueError("Not same amount of timesteps and data.")
93
-
94
- # - Replace heterogeneous number of spaces with a single space
95
- df_data["TO_SPLIT"] = df_data["TO_SPLIT"].str.replace(r" +", " ", regex=True).str.strip(" ")
96
-
97
- # - Retrieve arrays
98
- arr = df_data["TO_SPLIT"].str.split(" ", expand=True).to_numpy()
99
- # - Flatten by row and then reshape to n_timesteps x 1024
100
- arr = arr.flatten(order="C").reshape(len(df_time), 1024)
101
- # - Then concat all the 1024 bins
102
- df_arr = pd.DataFrame(arr, dtype="str")
103
- df_raw_drop_number = df_arr.agg(",".join, axis=1)
104
- df_raw_drop_number = df_raw_drop_number.rename("raw_drop_number")
105
-
106
- # - Create dataframe
107
- df = pd.concat([df_time, df_raw_drop_number], axis=1)
108
-
109
- return df
110
-
111
- ##------------------------------------------------------------------------.
112
- #### - Define glob pattern to search data files in <raw_dir>/data/<station_name>
113
- glob_patterns = "*.txt*"
114
-
115
- ####----------------------------------------------------------------------.
116
- #### - Create L0A products
117
- run_l0a(
118
- raw_dir=raw_dir,
119
- processed_dir=processed_dir,
120
- station_name=station_name,
121
- # Custom arguments of the reader for L0A processing
122
- glob_patterns=glob_patterns,
123
- column_names=column_names,
124
- reader_kwargs=reader_kwargs,
125
- df_sanitizer_fun=df_sanitizer_fun,
126
- # Processing options
127
- force=force,
128
- verbose=verbose,
129
- parallel=parallel,
130
- debugging_mode=debugging_mode,
131
- )
@@ -1,128 +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 = [
36
- "time",
37
- "id",
38
- "datalogger_temperature",
39
- "datalogger_voltage",
40
- "rainfall_rate_32bit",
41
- "rainfall_accumulated_32bit",
42
- "weather_code_synop_4680",
43
- "weather_code_synop_4677",
44
- "reflectivity_32bit",
45
- "mor_visibility",
46
- "laser_amplitude",
47
- "number_particles",
48
- "sensor_temperature",
49
- "sensor_heating_current",
50
- "sensor_battery_voltage",
51
- "sensor_status",
52
- "rainfall_amount_absolute_32bit",
53
- "datalogger_debug",
54
- "raw_drop_concentration",
55
- "raw_drop_average_velocity",
56
- "raw_drop_number",
57
- "datalogger_error",
58
- ]
59
-
60
- ##------------------------------------------------------------------------.
61
- #### - Define reader options
62
- reader_kwargs = {}
63
- # - Define delimiter
64
- reader_kwargs["delimiter"] = ","
65
- # Skip first 4 rows (it's a header)
66
- reader_kwargs["skiprows"] = 4
67
- # - Avoid first column to become df index
68
- reader_kwargs["index_col"] = False
69
- # - Define behaviour when encountering bad lines
70
- reader_kwargs["on_bad_lines"] = "skip"
71
- # - Define reader engine
72
- # - C engine is faster
73
- # - Python engine is more feature-complete
74
- reader_kwargs["engine"] = "python"
75
- # - Define on-the-fly decompression of on-disk data
76
- # - Available: gzip, bz2, zip
77
- reader_kwargs["compression"] = "infer"
78
- # - Strings to recognize as NA/NaN and replace with standard NA flags
79
- # - Already included: ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,
80
- # ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘<NA>’, ‘N/A’,
81
- # ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’
82
- reader_kwargs["na_values"] = ["na", "", "error"]
83
-
84
- ##------------------------------------------------------------------------.
85
- #### - Define dataframe sanitizer function for L0 processing
86
- def df_sanitizer_fun(df):
87
- # - Import pandas
88
- import pandas as pd
89
-
90
- # - Convert time column to datetime
91
- df["time"] = pd.to_datetime(df["time"], format="%Y-%m-%d %H:%M:%S", errors="coerce")
92
-
93
- # - Drop columns not agreeing with DISDRODB L0 standards
94
- columns_to_drop = [
95
- "id",
96
- "datalogger_voltage",
97
- "datalogger_temperature",
98
- "datalogger_debug",
99
- "datalogger_error",
100
- ]
101
- df = df.drop(columns=columns_to_drop)
102
-
103
- # - Remove " at the end of raw_drop_number
104
- df["raw_drop_number"] = df["raw_drop_number"].str.rstrip('"')
105
-
106
- return df
107
-
108
- ##------------------------------------------------------------------------.
109
- #### - Define glob pattern to search data files in <raw_dir>/data/<station_name>
110
- glob_patterns = "*.dat*"
111
-
112
- ####----------------------------------------------------------------------.
113
- #### - Create L0A products
114
- run_l0a(
115
- raw_dir=raw_dir,
116
- processed_dir=processed_dir,
117
- station_name=station_name,
118
- # Custom arguments of the reader for L0A processing
119
- glob_patterns=glob_patterns,
120
- column_names=column_names,
121
- reader_kwargs=reader_kwargs,
122
- df_sanitizer_fun=df_sanitizer_fun,
123
- # Processing options
124
- force=force,
125
- verbose=verbose,
126
- parallel=parallel,
127
- debugging_mode=debugging_mode,
128
- )