disdrodb 0.1.3__tar.gz → 0.1.5__tar.gz

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 (320) hide show
  1. {disdrodb-0.1.3/disdrodb.egg-info → disdrodb-0.1.5}/PKG-INFO +3 -2
  2. {disdrodb-0.1.3 → disdrodb-0.1.5}/README.md +1 -1
  3. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/__init__.py +4 -0
  4. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/_version.py +3 -3
  5. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/api/checks.py +70 -47
  6. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/api/configs.py +0 -2
  7. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/api/create_directories.py +0 -2
  8. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/api/info.py +3 -3
  9. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/api/io.py +48 -8
  10. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/api/path.py +116 -133
  11. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/api/search.py +12 -3
  12. disdrodb-0.1.5/disdrodb/cli/disdrodb_create_summary.py +113 -0
  13. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_create_summary_station.py +11 -1
  14. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_run_l0a_station.py +1 -1
  15. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_run_l0b_station.py +2 -2
  16. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_run_l0c_station.py +2 -2
  17. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_run_l1_station.py +2 -2
  18. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_run_l2e_station.py +2 -2
  19. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_run_l2m_station.py +2 -2
  20. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/constants.py +1 -1
  21. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/data_transfer/download_data.py +123 -7
  22. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/etc/products/L1/global.yaml +1 -1
  23. disdrodb-0.1.5/disdrodb/etc/products/L2E/5MIN.yaml +1 -0
  24. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/etc/products/L2E/global.yaml +1 -1
  25. disdrodb-0.1.5/disdrodb/etc/products/L2M/GAMMA_GS_ND_MAE.yaml +6 -0
  26. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/etc/products/L2M/GAMMA_ML.yaml +1 -1
  27. disdrodb-0.1.5/disdrodb/etc/products/L2M/LOGNORMAL_GS_LOG_ND_MAE.yaml +6 -0
  28. disdrodb-0.1.5/disdrodb/etc/products/L2M/LOGNORMAL_GS_ND_MAE.yaml +6 -0
  29. disdrodb-0.1.5/disdrodb/etc/products/L2M/LOGNORMAL_ML.yaml +8 -0
  30. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/etc/products/L2M/global.yaml +11 -3
  31. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/issue/writer.py +2 -0
  32. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/check_configs.py +49 -16
  33. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/LPM/l0a_encodings.yml +2 -2
  34. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/LPM/l0b_cf_attrs.yml +2 -2
  35. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/LPM/l0b_encodings.yml +2 -2
  36. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/LPM/raw_data_format.yml +2 -2
  37. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PWS100/l0b_encodings.yml +1 -0
  38. disdrodb-0.1.5/disdrodb/l0/configs/SWS250/bins_diameter.yml +108 -0
  39. disdrodb-0.1.5/disdrodb/l0/configs/SWS250/bins_velocity.yml +83 -0
  40. disdrodb-0.1.5/disdrodb/l0/configs/SWS250/l0a_encodings.yml +18 -0
  41. disdrodb-0.1.5/disdrodb/l0/configs/SWS250/l0b_cf_attrs.yml +72 -0
  42. disdrodb-0.1.5/disdrodb/l0/configs/SWS250/l0b_encodings.yml +155 -0
  43. disdrodb-0.1.5/disdrodb/l0/configs/SWS250/raw_data_format.yml +148 -0
  44. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/l0a_processing.py +10 -5
  45. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/l0b_nc_processing.py +10 -6
  46. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/l0b_processing.py +92 -72
  47. disdrodb-0.1.5/disdrodb/l0/l0c_processing.py +737 -0
  48. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/LPM/ARM/ARM_LPM.py +8 -1
  49. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/LPM/AUSTRALIA/MELBOURNE_2007_LPM.py +2 -2
  50. disdrodb-0.1.5/disdrodb/l0/readers/LPM/BELGIUM/ULIEGE.py +256 -0
  51. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/LPM/BRAZIL/CHUVA_LPM.py +2 -2
  52. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/LPM/BRAZIL/GOAMAZON_LPM.py +2 -2
  53. disdrodb-0.1.5/disdrodb/l0/readers/LPM/GERMANY/DWD.py +491 -0
  54. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +2 -2
  55. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/LPM/ITALY/GID_LPM_W.py +2 -2
  56. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/LPM/KIT/CHWALA.py +2 -2
  57. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/LPM/SLOVENIA/ARSO.py +107 -12
  58. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/LPM/SLOVENIA/UL.py +3 -3
  59. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/LPM/SWITZERLAND/INNERERIZ_LPM.py +2 -2
  60. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010.py +5 -14
  61. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010_UF.py +5 -14
  62. disdrodb-0.1.5/disdrodb/l0/readers/PARSIVEL/SLOVENIA/UL.py +230 -0
  63. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/ARM/ARM_PARSIVEL2.py +4 -0
  64. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/BRAZIL/CHUVA_PARSIVEL2.py +10 -14
  65. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/BRAZIL/GOAMAZON_PARSIVEL2.py +10 -14
  66. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT_NC.py → disdrodb-0.1.5/disdrodb/l0/readers/PARSIVEL2/CANADA/UQAM_NC.py +1 -1
  67. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/DENMARK/DTU.py +8 -14
  68. disdrodb-0.1.5/disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_raw.py +382 -0
  69. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/FINLAND/FMI_PARSIVEL2.py +4 -0
  70. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/FRANCE/OSUG.py +1 -1
  71. disdrodb-0.1.5/disdrodb/l0/readers/PARSIVEL2/GREECE/NOA.py +127 -0
  72. disdrodb-0.1.5/disdrodb/l0/readers/PARSIVEL2/ITALY/HYDROX.py +239 -0
  73. disdrodb-0.1.5/disdrodb/l0/readers/PARSIVEL2/MPI/BCO_PARSIVEL2.py +136 -0
  74. disdrodb-0.1.5/disdrodb/l0/readers/PARSIVEL2/MPI/BOWTIE.py +220 -0
  75. disdrodb-0.1.5/disdrodb/l0/readers/PARSIVEL2/NASA/LPVEX.py +109 -0
  76. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/NCAR/FARM_PARSIVEL2.py +5 -11
  77. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_MIPS.py +4 -17
  78. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +5 -14
  79. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_PJ.py +10 -13
  80. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_SB.py +10 -13
  81. disdrodb-0.1.5/disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT_NC.py +72 -0
  82. disdrodb-0.1.5/disdrodb/l0/readers/PARSIVEL2/PHILIPPINES/PANGASA.py +232 -0
  83. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/SPAIN/CENER.py +6 -18
  84. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL/SLOVENIA/UL.py → disdrodb-0.1.5/disdrodb/l0/readers/PARSIVEL2/SPAIN/GRANADA.py +35 -36
  85. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/USA/C3WE.py +7 -25
  86. disdrodb-0.1.5/disdrodb/l0/readers/PWS100/AUSTRIA/HOAL.py +321 -0
  87. disdrodb-0.1.5/disdrodb/l0/readers/SW250/BELGIUM/KMI.py +239 -0
  88. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l1/beard_model.py +31 -129
  89. disdrodb-0.1.5/disdrodb/l1/fall_velocity.py +359 -0
  90. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l1/filters.py +25 -28
  91. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l1/processing.py +12 -14
  92. disdrodb-0.1.5/disdrodb/l1_env/routines.py +82 -0
  93. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l2/empirical_dsd.py +6 -0
  94. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l2/processing.py +3 -3
  95. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/metadata/checks.py +132 -125
  96. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/metadata/geolocation.py +0 -2
  97. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/psd/fitting.py +180 -210
  98. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/psd/models.py +1 -1
  99. disdrodb-0.1.5/disdrodb/routines/__init__.py +54 -0
  100. disdrodb-0.1.3/disdrodb/l0/routines.py → disdrodb-0.1.5/disdrodb/routines/l0.py +288 -418
  101. disdrodb-0.1.3/disdrodb/l1/routines.py → disdrodb-0.1.5/disdrodb/routines/l1.py +60 -92
  102. disdrodb-0.1.3/disdrodb/l2/routines.py → disdrodb-0.1.5/disdrodb/routines/l2.py +284 -485
  103. disdrodb-0.1.3/disdrodb/routines.py → disdrodb-0.1.5/disdrodb/routines/wrappers.py +100 -7
  104. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/scattering/axis_ratio.py +95 -85
  105. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/scattering/permittivity.py +24 -0
  106. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/scattering/routines.py +56 -36
  107. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/summary/routines.py +147 -45
  108. disdrodb-0.1.5/disdrodb/utils/archiving.py +434 -0
  109. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/attrs.py +2 -0
  110. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/cli.py +5 -5
  111. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/dask.py +62 -1
  112. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/decorators.py +31 -0
  113. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/encoding.py +10 -1
  114. {disdrodb-0.1.3/disdrodb/l2 → disdrodb-0.1.5/disdrodb/utils}/event.py +1 -66
  115. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/logger.py +1 -1
  116. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/manipulations.py +22 -12
  117. disdrodb-0.1.5/disdrodb/utils/routines.py +166 -0
  118. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/time.py +5 -293
  119. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/xarray.py +3 -0
  120. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/viz/plots.py +109 -15
  121. {disdrodb-0.1.3 → disdrodb-0.1.5/disdrodb.egg-info}/PKG-INFO +3 -2
  122. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb.egg-info/SOURCES.txt +33 -5
  123. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb.egg-info/entry_points.txt +1 -0
  124. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb.egg-info/requires.txt +1 -0
  125. {disdrodb-0.1.3 → disdrodb-0.1.5}/pyproject.toml +7 -4
  126. disdrodb-0.1.3/disdrodb/l0/l0c_processing.py +0 -619
  127. disdrodb-0.1.3/disdrodb/l1/fall_velocity.py +0 -260
  128. disdrodb-0.1.3/disdrodb/l1_env/routines.py +0 -53
  129. {disdrodb-0.1.3 → disdrodb-0.1.5}/.codebeatignore +0 -0
  130. {disdrodb-0.1.3 → disdrodb-0.1.5}/.coveragerc +0 -0
  131. {disdrodb-0.1.3 → disdrodb-0.1.5}/.gitignore +0 -0
  132. {disdrodb-0.1.3 → disdrodb-0.1.5}/.pre-commit-config.yaml +0 -0
  133. {disdrodb-0.1.3 → disdrodb-0.1.5}/.readthedocs.yaml +0 -0
  134. {disdrodb-0.1.3 → disdrodb-0.1.5}/AUTHORS.md +0 -0
  135. {disdrodb-0.1.3 → disdrodb-0.1.5}/CHANGELOG.md +0 -0
  136. {disdrodb-0.1.3 → disdrodb-0.1.5}/CODE_OF_CONDUCT.md +0 -0
  137. {disdrodb-0.1.3 → disdrodb-0.1.5}/CONTRIBUTING.rst +0 -0
  138. {disdrodb-0.1.3 → disdrodb-0.1.5}/LICENSE +0 -0
  139. {disdrodb-0.1.3 → disdrodb-0.1.5}/MANIFEST.in +0 -0
  140. {disdrodb-0.1.3 → disdrodb-0.1.5}/Makefile +0 -0
  141. {disdrodb-0.1.3 → disdrodb-0.1.5}/SECURITY.md +0 -0
  142. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/_config.py +0 -0
  143. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/accessor/__init__.py +0 -0
  144. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/accessor/methods.py +0 -0
  145. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/api/__init__.py +0 -0
  146. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_check_metadata_archive.py +0 -0
  147. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_data_archive_directory.py +0 -0
  148. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_download_archive.py +0 -0
  149. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_download_metadata_archive.py +0 -0
  150. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_download_station.py +0 -0
  151. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_initialize_station.py +0 -0
  152. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_metadata_archive_directory.py +0 -0
  153. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_open_data_archive.py +0 -0
  154. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_open_logs_directory.py +0 -0
  155. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_open_metadata_archive.py +0 -0
  156. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_open_metadata_directory.py +0 -0
  157. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_open_product_directory.py +0 -0
  158. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_open_readers_directory.py +0 -0
  159. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_run_l0.py +0 -0
  160. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_run_l0_station.py +0 -0
  161. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_run_l0a.py +0 -0
  162. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_run_l0b.py +0 -0
  163. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_run_l0c.py +0 -0
  164. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_run_l1.py +0 -0
  165. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_run_l2e.py +0 -0
  166. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_run_l2m.py +0 -0
  167. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_upload_archive.py +0 -0
  168. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/cli/disdrodb_upload_station.py +0 -0
  169. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/configs.py +0 -0
  170. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/data_transfer/__init__.py +0 -0
  171. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/data_transfer/upload_data.py +0 -0
  172. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/data_transfer/zenodo.py +0 -0
  173. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/docs.py +0 -0
  174. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/etc/configs/attributes.yaml +0 -0
  175. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/etc/configs/encodings.yaml +0 -0
  176. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/etc/products/L2E/10MIN.yaml +0 -0
  177. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/etc/products/L2E/1MIN.yaml +0 -0
  178. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/etc/products/L2M/10MIN.yaml +0 -0
  179. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/etc/products/L2M/NGAMMA_GS_LOG_ND_MAE.yaml +0 -0
  180. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/etc/products/L2M/NGAMMA_GS_ND_MAE.yaml +0 -0
  181. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/etc/products/L2M/NGAMMA_GS_Z_MAE.yaml +0 -0
  182. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/issue/__init__.py +0 -0
  183. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/issue/checks.py +0 -0
  184. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/issue/reader.py +0 -0
  185. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/__init__.py +0 -0
  186. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/check_standards.py +0 -0
  187. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/LPM/bins_diameter.yml +0 -0
  188. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/LPM/bins_velocity.yml +0 -0
  189. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PARSIVEL/bins_diameter.yml +0 -0
  190. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PARSIVEL/bins_velocity.yml +0 -0
  191. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PARSIVEL/l0a_encodings.yml +0 -0
  192. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PARSIVEL/l0b_cf_attrs.yml +0 -0
  193. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PARSIVEL/l0b_encodings.yml +0 -0
  194. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PARSIVEL/raw_data_format.yml +0 -0
  195. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PARSIVEL2/bins_diameter.yml +0 -0
  196. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PARSIVEL2/bins_velocity.yml +0 -0
  197. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PARSIVEL2/l0a_encodings.yml +0 -0
  198. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PARSIVEL2/l0b_cf_attrs.yml +0 -0
  199. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PARSIVEL2/l0b_encodings.yml +0 -0
  200. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PARSIVEL2/raw_data_format.yml +0 -0
  201. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PWS100/bins_diameter.yml +0 -0
  202. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PWS100/bins_velocity.yml +0 -0
  203. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PWS100/l0a_encodings.yml +0 -0
  204. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PWS100/l0b_cf_attrs.yml +0 -0
  205. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/PWS100/raw_data_format.yml +0 -0
  206. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/RD80/bins_diameter.yml +0 -0
  207. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/RD80/bins_velocity.yml +0 -0
  208. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/RD80/l0a_encodings.yml +0 -0
  209. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/RD80/l0b_cf_attrs.yml +0 -0
  210. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/RD80/l0b_encodings.yml +0 -0
  211. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/configs/RD80/raw_data_format.yml +0 -0
  212. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/l0_reader.py +0 -0
  213. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/manuals/LPM.pdf +0 -0
  214. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/manuals/ODM470.pdf +0 -0
  215. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/manuals/PARSIVEL.pdf +0 -0
  216. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/manuals/PARSIVEL2.pdf +0 -0
  217. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/manuals/PWS100.pdf +0 -0
  218. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/manuals/RD80.pdf +0 -0
  219. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/manuals/SWS250.pdf +0 -0
  220. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/manuals/VPF730.pdf +0 -0
  221. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/manuals/VPF750.pdf +0 -0
  222. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_LPM_NC.py +0 -0
  223. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/LPM/UK/DIVEN.py +0 -0
  224. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/AUSTRALIA/MELBOURNE_2007_PARSIVEL.py +0 -0
  225. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/CHINA/CHONGQING.py +0 -0
  226. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/ARCTIC_2021.py +0 -0
  227. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/COMMON_2011.py +0 -0
  228. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/DAVOS_2009_2011.py +0 -0
  229. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_2009.py +0 -0
  230. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2008.py +0 -0
  231. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2010.py +0 -0
  232. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2011.py +0 -0
  233. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2012.py +0 -0
  234. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/GENEPI_2007.py +0 -0
  235. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007.py +0 -0
  236. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007_2.py +0 -0
  237. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/HPICONET_2010.py +0 -0
  238. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP2.py +0 -0
  239. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP3.py +0 -0
  240. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP4.py +0 -0
  241. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2018.py +0 -0
  242. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2019.py +0 -0
  243. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/PARADISO_2014.py +0 -0
  244. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/PARSIVEL_2007.py +0 -0
  245. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/PLATO_2019.py +0 -0
  246. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019.py +0 -0
  247. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019_WJF.py +0 -0
  248. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/RIETHOLZBACH_2011.py +0 -0
  249. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2017.py +0 -0
  250. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2019.py +0 -0
  251. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/EPFL/UNIL_2022.py +0 -0
  252. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/GPM/IFLOODS.py +0 -0
  253. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/GPM/LPVEX.py +0 -0
  254. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/GPM/MC3E.py +0 -0
  255. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/GPM/PIERS.py +0 -0
  256. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/JAPAN/JMA.py +0 -0
  257. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/NCAR/CCOPE_2015.py +0 -0
  258. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/NCAR/OWLES_MIPS.py +0 -0
  259. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/NCAR/PECAN_MOBILE.py +0 -0
  260. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/NCAR/PLOWS_MIPS.py +0 -0
  261. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2009.py +0 -0
  262. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/BELGIUM/ILVO.py +0 -0
  263. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_nc.py +0 -0
  264. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/FRANCE/ENPC_PARSIVEL2.py +0 -0
  265. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/FRANCE/SIRTA_PARSIVEL2.py +0 -0
  266. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/GPM/GCPEX.py +0 -0
  267. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/GPM/NSSTC.py +0 -0
  268. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/ITALY/GID_PARSIVEL2.py +0 -0
  269. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/KIT/BURKINA_FASO.py +0 -0
  270. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/KIT/TEAMX.py +0 -0
  271. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/MEXICO/OH_IIUNAM_nc.py +0 -0
  272. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/NASA/APU.py +0 -0
  273. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_FP3.py +0 -0
  274. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_MIPS.py +0 -0
  275. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_PIPS.py +0 -0
  276. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P1.py +0 -0
  277. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P2.py +0 -0
  278. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py +0 -0
  279. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/SPAIN/CR1000DL.py +0 -0
  280. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PARSIVEL2/SPAIN/LIAISE.py +0 -0
  281. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100.py +0 -0
  282. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100_SIRTA.py +0 -0
  283. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/RD80/BRAZIL/CHUVA_RD80.py +0 -0
  284. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/RD80/BRAZIL/GOAMAZON_RD80.py +0 -0
  285. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/RD80/NCAR/CINDY_2011_RD80.py +0 -0
  286. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/RD80/NCAR/RELAMPAGO_RD80.py +0 -0
  287. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/RD80/NOAA/PSL_RD80.py +0 -0
  288. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/__init__.py +0 -0
  289. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/template_reader_raw_netcdf_data.py +0 -0
  290. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/readers/template_reader_raw_text_data.py +0 -0
  291. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/standards.py +0 -0
  292. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l0/template_tools.py +0 -0
  293. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l1/__init__.py +0 -0
  294. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l1/resampling.py +0 -0
  295. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l1_env/__init__.py +0 -0
  296. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/l2/__init__.py +0 -0
  297. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/metadata/__init__.py +0 -0
  298. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/metadata/download.py +0 -0
  299. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/metadata/info.py +0 -0
  300. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/metadata/manipulation.py +0 -0
  301. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/metadata/reader.py +0 -0
  302. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/metadata/search.py +0 -0
  303. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/metadata/standards.py +0 -0
  304. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/metadata/writer.py +0 -0
  305. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/psd/__init__.py +0 -0
  306. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/scattering/__init__.py +0 -0
  307. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/summary/__init__.py +0 -0
  308. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/__init__.py +0 -0
  309. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/compression.py +0 -0
  310. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/dataframe.py +0 -0
  311. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/directories.py +0 -0
  312. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/list.py +0 -0
  313. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/subsetting.py +0 -0
  314. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/warnings.py +0 -0
  315. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/writer.py +0 -0
  316. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/utils/yaml.py +0 -0
  317. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb/viz/__init__.py +0 -0
  318. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb.egg-info/dependency_links.txt +0 -0
  319. {disdrodb-0.1.3 → disdrodb-0.1.5}/disdrodb.egg-info/top_level.txt +0 -0
  320. {disdrodb-0.1.3 → disdrodb-0.1.5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: disdrodb
3
- Version: 0.1.3
3
+ Version: 0.1.5
4
4
  Summary: disdrodb provides tools to download, standardize, share and analyze global disdrometer data.
5
5
  Author: Gionata Ghiggi
6
6
  Project-URL: homepage, https://github.com/ltelab/disdrodb
@@ -33,6 +33,7 @@ Requires-Dist: numpy
33
33
  Requires-Dist: scipy
34
34
  Requires-Dist: dask[distributed]
35
35
  Requires-Dist: xarray
36
+ Requires-Dist: bottleneck
36
37
  Requires-Dist: matplotlib
37
38
  Provides-Extra: dev
38
39
  Requires-Dist: jupyter; extra == "dev"
@@ -193,7 +194,7 @@ disdrodb_run_l2m
193
194
 
194
195
  ### 💫 Analyze Analysis-Ready Products
195
196
 
196
- The softwares `open_dataset` function **lazily** opens all station files of a given product:
197
+ The software's `open_dataset` function **lazily** opens all station files of a given product:
197
198
 
198
199
  ```python
199
200
  import disdrodb
@@ -143,7 +143,7 @@ disdrodb_run_l2m
143
143
 
144
144
  ### 💫 Analyze Analysis-Ready Products
145
145
 
146
- The softwares `open_dataset` function **lazily** opens all station files of a given product:
146
+ The software's `open_dataset` function **lazily** opens all station files of a given product:
147
147
 
148
148
  ```python
149
149
  import disdrodb
@@ -62,6 +62,8 @@ from disdrodb.metadata.checks import (
62
62
  check_station_metadata,
63
63
  )
64
64
  from disdrodb.routines import (
65
+ create_summary,
66
+ create_summary_station,
65
67
  run_l0,
66
68
  run_l0_station,
67
69
  run_l0a,
@@ -126,6 +128,8 @@ __all__ = [
126
128
  "check_metadata_archive",
127
129
  "check_metadata_archive_geolocation",
128
130
  "check_station_metadata",
131
+ "create_summary",
132
+ "create_summary_station",
129
133
  "decibel",
130
134
  "define_configs",
131
135
  "download_archive",
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.1.3'
32
- __version_tuple__ = version_tuple = (0, 1, 3)
31
+ __version__ = version = '0.1.5'
32
+ __version_tuple__ = version_tuple = (0, 1, 5)
33
33
 
34
- __commit_id__ = commit_id = 'g44c8701a4'
34
+ __commit_id__ = commit_id = 'g71d96e131'
@@ -144,14 +144,14 @@ def check_measurement_intervals(measurement_intervals):
144
144
 
145
145
  def check_sample_interval(sample_interval):
146
146
  """Check sample_interval argument validity."""
147
- if not isinstance(sample_interval, int):
148
- raise ValueError("'sample_interval' must be an integer.")
147
+ if not isinstance(sample_interval, int) or isinstance(sample_interval, bool):
148
+ raise TypeError("'sample_interval' must be an integer.")
149
149
 
150
150
 
151
151
  def check_rolling(rolling):
152
152
  """Check rolling argument validity."""
153
153
  if not isinstance(rolling, bool):
154
- raise ValueError("'rolling' must be a boolean.")
154
+ raise TypeError("'rolling' must be a boolean.")
155
155
 
156
156
 
157
157
  def check_folder_partitioning(folder_partitioning):
@@ -163,12 +163,12 @@ def check_folder_partitioning(folder_partitioning):
163
163
  folder_partitioning : str or None
164
164
  Defines the subdirectory structure based on the dataset's start time.
165
165
  Allowed values are:
166
- - "": No additional subdirectories, files are saved directly in data_dir.
167
- - "year": Files are stored under a subdirectory for the year (<data_dir>/2025).
168
- - "year/month": Files are stored under subdirectories by year and month (<data_dir>/2025/04).
169
- - "year/month/day": Files are stored under subdirectories by year, month and day (<data_dir>/2025/04/01).
170
- - "year/month_name": Files are stored under subdirectories by year and month name (<data_dir>/2025/April).
171
- - "year/quarter": Files are stored under subdirectories by year and quarter (<data_dir>/2025/Q2).
166
+ - "" or None: No additional subdirectories, files are saved directly in dir.
167
+ - "year": Files are stored under a subdirectory for the year (<dir>/2025).
168
+ - "year/month": Files are stored under subdirectories by year and month (<dir>/2025/04).
169
+ - "year/month/day": Files are stored under subdirectories by year, month and day (<dir>/2025/04/01).
170
+ - "year/month_name": Files are stored under subdirectories by year and month name (<dir>/2025/April).
171
+ - "year/quarter": Files are stored under subdirectories by year and quarter (<dir>/2025/Q2).
172
172
 
173
173
  Returns
174
174
  -------
@@ -176,6 +176,8 @@ def check_folder_partitioning(folder_partitioning):
176
176
  The verified folder partitioning scheme.
177
177
  """
178
178
  valid_options = ["", "year", "year/month", "year/month/day", "year/month_name", "year/quarter"]
179
+ if folder_partitioning is None:
180
+ folder_partitioning = ""
179
181
  if folder_partitioning not in valid_options:
180
182
  raise ValueError(
181
183
  f"Invalid folder_partitioning scheme '{folder_partitioning}'. Valid options are: {valid_options}.",
@@ -331,16 +333,37 @@ def check_valid_fields(fields, available_fields, field_name, invalid_fields_poli
331
333
  fields = [fields]
332
334
  fields = np.unique(np.array(fields))
333
335
  invalid_fields_policy = check_invalid_fields_policy(invalid_fields_policy)
336
+
334
337
  # Check for invalid fields
335
338
  fields = np.array(fields)
336
339
  is_valid = np.isin(fields, available_fields)
337
340
  invalid_fields_values = fields[~is_valid].tolist()
338
341
  fields = fields[is_valid].tolist()
342
+
343
+ # If invalid fields, suggest corrections using difflib
344
+ if invalid_fields_values:
345
+
346
+ # Format invalid fields nicely (avoid single-element lists)
347
+ if len(invalid_fields_values) == 1:
348
+ invalid_fields_str = f"'{invalid_fields_values[0]}'"
349
+ else:
350
+ invalid_fields_str = f"{invalid_fields_values}"
351
+
352
+ # Prepare suggestion string
353
+ suggestions = []
354
+ for invalid in invalid_fields_values:
355
+ matches = difflib.get_close_matches(invalid, available_fields, n=1, cutoff=0.4)
356
+ if matches:
357
+ suggestions.append(f"Did you mean '{matches[0]}' instead of '{invalid}'?")
358
+ suggestion_msg = " " + " ".join(suggestions) if suggestions else ""
359
+
339
360
  # Error handling for invalid fields were found
340
361
  if invalid_fields_policy == "warn" and invalid_fields_values:
341
- warnings.warn(f"Ignoring invalid {field_name}: {invalid_fields_values}", UserWarning, stacklevel=2)
362
+ msg = f"Ignoring invalid {field_name}: {invalid_fields_str}.{suggestion_msg}"
363
+ warnings.warn(msg, UserWarning, stacklevel=2)
342
364
  elif invalid_fields_policy == "raise" and invalid_fields_values:
343
- raise ValueError(f"These {field_name} does not exist: {invalid_fields_values}.")
365
+ msg = f"These {field_name} do not exist: {invalid_fields_str}.{suggestion_msg}"
366
+ raise ValueError(msg)
344
367
  else: # "ignore" silently drop invalid entries
345
368
  pass
346
369
  # If no valid fields left, raise error
@@ -349,38 +372,6 @@ def check_valid_fields(fields, available_fields, field_name, invalid_fields_poli
349
372
  return fields
350
373
 
351
374
 
352
- def has_available_data(
353
- data_source,
354
- campaign_name,
355
- station_name,
356
- product,
357
- data_archive_dir=None,
358
- # Product Options
359
- **product_kwargs,
360
- ):
361
- """Return ``True`` if data are available for the given product and station."""
362
- # Define product directory
363
- data_dir = define_data_dir(
364
- product=product,
365
- data_archive_dir=data_archive_dir,
366
- data_source=data_source,
367
- campaign_name=campaign_name,
368
- station_name=station_name,
369
- # Directory options
370
- check_exists=False,
371
- # Product Options
372
- **product_kwargs,
373
- )
374
- # If the product directory does not exists, return False
375
- if not os.path.isdir(data_dir):
376
- return False
377
-
378
- # If no files, return False
379
- filepaths = list_files(data_dir, recursive=True)
380
- nfiles = len(filepaths)
381
- return nfiles >= 1
382
-
383
-
384
375
  def check_station_inputs(
385
376
  data_source,
386
377
  campaign_name,
@@ -396,6 +387,7 @@ def check_station_inputs(
396
387
  matches = difflib.get_close_matches(data_source, valid_data_sources, n=1, cutoff=0.4)
397
388
  suggestion = f"Did you mean '{matches[0]}'?" if matches else ""
398
389
  raise ValueError(f"DISDRODB does not include a data source named {data_source}. {suggestion}")
390
+
399
391
  # Check campaign name
400
392
  valid_campaigns = disdrodb.available_campaigns(data_sources=data_source, metadata_archive_dir=metadata_archive_dir)
401
393
  if campaign_name not in valid_campaigns:
@@ -420,6 +412,38 @@ def check_station_inputs(
420
412
  )
421
413
 
422
414
 
415
+ def has_available_data(
416
+ data_source,
417
+ campaign_name,
418
+ station_name,
419
+ product,
420
+ data_archive_dir=None,
421
+ # Product Options
422
+ **product_kwargs,
423
+ ):
424
+ """Return ``True`` if data are available for the given product and station."""
425
+ # Define product directory
426
+ data_dir = define_data_dir(
427
+ product=product,
428
+ data_archive_dir=data_archive_dir,
429
+ data_source=data_source,
430
+ campaign_name=campaign_name,
431
+ station_name=station_name,
432
+ # Directory options
433
+ check_exists=False,
434
+ # Product Options
435
+ **product_kwargs,
436
+ )
437
+ # If the product directory does not exists, return False
438
+ if not os.path.isdir(data_dir):
439
+ return False
440
+
441
+ # If no files, return False
442
+ filepaths = list_files(data_dir, recursive=True)
443
+ nfiles = len(filepaths)
444
+ return nfiles >= 1
445
+
446
+
423
447
  def check_data_availability(
424
448
  product,
425
449
  data_source,
@@ -480,10 +504,9 @@ def check_issue_dir(data_source, campaign_name, metadata_archive_dir=None):
480
504
  campaign_name=campaign_name,
481
505
  check_exists=False,
482
506
  )
483
- if not os.path.exists(issue_dir) and os.path.isdir(issue_dir):
484
- msg = "The issue directory does not exist at {issue_dir}."
507
+ if not os.path.exists(issue_dir) or not os.path.isdir(issue_dir):
508
+ msg = f"The issue directory does not exist at {issue_dir}."
485
509
  logger.error(msg)
486
- raise ValueError(msg)
487
510
  return issue_dir
488
511
 
489
512
 
@@ -504,7 +527,7 @@ def check_issue_file(data_source, campaign_name, station_name, metadata_archive_
504
527
  station_name=station_name,
505
528
  check_exists=False,
506
529
  )
507
- # Check existence
530
+ # Check existence. If not, create one !
508
531
  if not os.path.exists(issue_filepath):
509
532
  create_station_issue(
510
533
  metadata_archive_dir=metadata_archive_dir,
@@ -54,8 +54,6 @@ def get_sensor_configs_dir(sensor_name: str, product: str) -> str:
54
54
  config_dir = define_config_dir(product=product)
55
55
  config_sensor_dir = os.path.join(config_dir, sensor_name)
56
56
  if not os.path.exists(config_sensor_dir):
57
- list_sensors = sorted(list_directories(config_dir, recursive=False, return_paths=False))
58
- print(f"Available sensor_name are {list_sensors}")
59
57
  raise ValueError(f"The config directory {config_sensor_dir} does not exist.")
60
58
  return config_sensor_dir
61
59
 
@@ -85,8 +85,6 @@ def create_l0_directory_structure(
85
85
  ``product = "L0A"`` will call ``run_l0a``.
86
86
  ``product = "L0B"`` will call ``run_l0b_nc``.
87
87
  """
88
- from disdrodb.configs import get_data_archive_dir, get_metadata_archive_dir
89
-
90
88
  # Retrieve the DISDRODB Metadata Archive directory
91
89
  data_archive_dir = get_data_archive_dir(data_archive_dir)
92
90
  metadata_archive_dir = get_metadata_archive_dir(metadata_archive_dir)
@@ -410,8 +410,8 @@ def get_time_component(time, component):
410
410
  return str(func_dict[component](time))
411
411
 
412
412
 
413
- def _get_groups_value(groups, filepath):
414
- """Return the value associated to the groups keys.
413
+ def get_groups_value(groups, filepath):
414
+ """Return a string associated to the groups keys.
415
415
 
416
416
  If multiple keys are specified, the value returned is a string of format: ``<group_value_1>/<group_value_2>/...``
417
417
 
@@ -463,5 +463,5 @@ def group_filepaths(filepaths, groups=None):
463
463
  return filepaths
464
464
  groups = check_groups(groups)
465
465
  filepaths_dict = defaultdict(list)
466
- _ = [filepaths_dict[_get_groups_value(groups, filepath)].append(filepath) for filepath in filepaths]
466
+ _ = [filepaths_dict[get_groups_value(groups, filepath)].append(filepath) for filepath in filepaths]
467
467
  return dict(filepaths_dict)
@@ -133,6 +133,7 @@ def find_files(
133
133
  product,
134
134
  debugging_mode: bool = False,
135
135
  data_archive_dir: Optional[str] = None,
136
+ metadata_archive_dir: Optional[str] = None,
136
137
  glob_pattern=None,
137
138
  start_time=None,
138
139
  end_time=None,
@@ -198,6 +199,7 @@ def find_files(
198
199
  data_source=data_source,
199
200
  campaign_name=campaign_name,
200
201
  station_name=station_name,
202
+ metadata_archive_dir=metadata_archive_dir,
201
203
  )
202
204
  glob_pattern = metadata.get("raw_data_glob_pattern", "")
203
205
 
@@ -232,7 +234,7 @@ def find_files(
232
234
  #### DISDRODB Open Product Files
233
235
 
234
236
 
235
- def open_raw_files(filepaths, data_source, campaign_name, station_name):
237
+ def _open_raw_files(filepaths, data_source, campaign_name, station_name, metadata_archive_dir):
236
238
  """Open raw files to DISDRODB L0A or L0B format.
237
239
 
238
240
  Raw text files are opened into a DISDRODB L0A pandas Dataframe.
@@ -247,6 +249,7 @@ def open_raw_files(filepaths, data_source, campaign_name, station_name):
247
249
  data_source=data_source,
248
250
  campaign_name=campaign_name,
249
251
  station_name=station_name,
252
+ metadata_archive_dir=metadata_archive_dir,
250
253
  )
251
254
  sensor_name = metadata["sensor_name"]
252
255
 
@@ -256,6 +259,7 @@ def open_raw_files(filepaths, data_source, campaign_name, station_name):
256
259
  data_source=data_source,
257
260
  campaign_name=campaign_name,
258
261
  station_name=station_name,
262
+ metadata_archive_dir=metadata_archive_dir,
259
263
  )
260
264
  except Exception:
261
265
  issue_dict = None
@@ -265,6 +269,7 @@ def open_raw_files(filepaths, data_source, campaign_name, station_name):
265
269
  data_source=data_source,
266
270
  campaign_name=campaign_name,
267
271
  station_name=station_name,
272
+ metadata_archive_dir=metadata_archive_dir,
268
273
  )
269
274
  # Return DISDRODB L0A dataframe if raw text files
270
275
  if metadata["raw_data_format"] == "txt":
@@ -289,6 +294,35 @@ def open_raw_files(filepaths, data_source, campaign_name, station_name):
289
294
  return ds
290
295
 
291
296
 
297
+ def filter_dataset_by_time(ds, start_time=None, end_time=None):
298
+ """Subset an xarray.Dataset by time, robust to duplicated/non-monotonic indices.
299
+
300
+ NOTE: ds.sel(time=slice(start_time, end_time)) fails in presence of duplicated
301
+ timesteps because time 'index is not monotonic increasing or decreasing'.
302
+
303
+ Parameters
304
+ ----------
305
+ ds : xr.Dataset
306
+ Dataset with a `time` coordinate.
307
+ start_time : np.datetime64 or None
308
+ Inclusive start bound. If None, no lower bound is applied.
309
+ end_time : np.datetime64 or None
310
+ Inclusive end bound. If None, no upper bound is applied.
311
+
312
+ Returns
313
+ -------
314
+ xr.Dataset
315
+ Subset dataset with the same ordering of timesteps (duplicates preserved).
316
+ """
317
+ time = ds["time"].to_numpy()
318
+ mask = np.ones(time.shape, dtype=bool)
319
+ if start_time is not None:
320
+ mask &= time >= np.array(start_time, dtype="datetime64[ns]")
321
+ if end_time is not None:
322
+ mask &= time <= np.array(end_time, dtype="datetime64[ns]")
323
+ return ds.isel(time=np.where(mask)[0])
324
+
325
+
292
326
  def open_netcdf_files(
293
327
  filepaths,
294
328
  chunks=-1,
@@ -299,7 +333,10 @@ def open_netcdf_files(
299
333
  compute=True,
300
334
  **open_kwargs,
301
335
  ):
302
- """Open DISDRODB netCDF files using xarray."""
336
+ """Open DISDRODB netCDF files using xarray.
337
+
338
+ Using combine="nested" and join="outer" ensure that duplicated timesteps are not overwritten!
339
+ """
303
340
  import xarray as xr
304
341
 
305
342
  # Ensure variables is a list
@@ -313,6 +350,7 @@ def open_netcdf_files(
313
350
  filepaths,
314
351
  chunks=chunks,
315
352
  combine="nested",
353
+ join="outer",
316
354
  concat_dim="time",
317
355
  engine="netcdf4",
318
356
  parallel=parallel,
@@ -329,7 +367,8 @@ def open_netcdf_files(
329
367
  if variables is not None and preprocess is None:
330
368
  ds = ds[variables]
331
369
  # - Subset time
332
- ds = ds.sel(time=slice(start_time, end_time))
370
+ if start_time is not None or end_time is not None:
371
+ ds = filter_dataset_by_time(ds, start_time=start_time, end_time=end_time)
333
372
  # - If compute=True, load in memory and close connections to files
334
373
  if compute:
335
374
  dataset = ds.compute()
@@ -349,6 +388,7 @@ def open_dataset(
349
388
  product_kwargs=None,
350
389
  debugging_mode: bool = False,
351
390
  data_archive_dir: Optional[str] = None,
391
+ metadata_archive_dir: Optional[str] = None,
352
392
  chunks=-1,
353
393
  parallel=False,
354
394
  compute=False,
@@ -399,6 +439,7 @@ def open_dataset(
399
439
  # List product files
400
440
  filepaths = find_files(
401
441
  data_archive_dir=data_archive_dir,
442
+ metadata_archive_dir=metadata_archive_dir,
402
443
  data_source=data_source,
403
444
  campaign_name=campaign_name,
404
445
  station_name=station_name,
@@ -413,11 +454,12 @@ def open_dataset(
413
454
  # - For raw txt files return DISDRODB L0A dataframe
414
455
  # - For raw netCDF files return DISDRODB L0B dataframe
415
456
  if product == "RAW":
416
- obj = open_raw_files(
457
+ obj = _open_raw_files(
417
458
  filepaths=filepaths,
418
459
  data_source=data_source,
419
460
  campaign_name=campaign_name,
420
461
  station_name=station_name,
462
+ metadata_archive_dir=metadata_archive_dir,
421
463
  )
422
464
  return obj
423
465
 
@@ -464,11 +506,9 @@ def remove_product(
464
506
  station_name=station_name,
465
507
  **product_kwargs,
466
508
  )
467
- if logger is not None:
468
- log_info(logger=logger, msg="Removal of {product} files started.", verbose=verbose)
509
+ log_info(logger=logger, msg="Removal of {product} files started.", verbose=verbose)
469
510
  shutil.rmtree(data_dir)
470
- if logger is not None:
471
- log_info(logger=logger, msg="Removal of {product} files ended.", verbose=verbose)
511
+ log_info(logger=logger, msg="Removal of {product} files ended.", verbose=verbose)
472
512
 
473
513
 
474
514
  ####--------------------------------------------------------------------------.