disdrodb 0.2.0__py3-none-any.whl → 0.3.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.
- disdrodb/__init__.py +1 -1
- disdrodb/_config.py +1 -3
- disdrodb/_version.py +2 -2
- disdrodb/accessor/__init__.py +1 -1
- disdrodb/accessor/methods.py +18 -11
- disdrodb/api/checks.py +2 -4
- disdrodb/api/configs.py +1 -3
- disdrodb/api/create_directories.py +4 -6
- disdrodb/api/info.py +1 -3
- disdrodb/api/io.py +15 -9
- disdrodb/api/path.py +1 -3
- disdrodb/cli/disdrodb_check_metadata_archive.py +2 -2
- disdrodb/cli/disdrodb_check_products_options.py +44 -0
- disdrodb/cli/disdrodb_create_summary.py +48 -22
- disdrodb/cli/disdrodb_create_summary_station.py +39 -18
- disdrodb/cli/disdrodb_data_archive_directory.py +1 -3
- disdrodb/cli/disdrodb_download_archive.py +45 -24
- disdrodb/cli/disdrodb_download_metadata_archive.py +27 -16
- disdrodb/cli/disdrodb_download_station.py +56 -26
- disdrodb/cli/disdrodb_initialize_station.py +40 -20
- disdrodb/cli/disdrodb_metadata_archive_directory.py +1 -3
- disdrodb/cli/disdrodb_open_data_archive.py +16 -11
- disdrodb/cli/disdrodb_open_logs_directory.py +29 -18
- disdrodb/cli/disdrodb_open_metadata_archive.py +25 -11
- disdrodb/cli/disdrodb_open_metadata_directory.py +32 -20
- disdrodb/cli/disdrodb_open_product_directory.py +38 -21
- disdrodb/cli/disdrodb_open_readers_directory.py +1 -3
- disdrodb/cli/disdrodb_run.py +189 -0
- disdrodb/cli/disdrodb_run_l0.py +55 -64
- disdrodb/cli/disdrodb_run_l0_station.py +47 -52
- disdrodb/cli/disdrodb_run_l0a.py +47 -45
- disdrodb/cli/disdrodb_run_l0a_station.py +38 -37
- disdrodb/cli/disdrodb_run_l0b.py +45 -45
- disdrodb/cli/disdrodb_run_l0b_station.py +37 -36
- disdrodb/cli/disdrodb_run_l0c.py +50 -47
- disdrodb/cli/disdrodb_run_l0c_station.py +41 -38
- disdrodb/cli/disdrodb_run_l1.py +49 -45
- disdrodb/cli/disdrodb_run_l1_station.py +40 -37
- disdrodb/cli/disdrodb_run_l2e.py +50 -45
- disdrodb/cli/disdrodb_run_l2e_station.py +41 -37
- disdrodb/cli/disdrodb_run_l2m.py +49 -45
- disdrodb/cli/disdrodb_run_l2m_station.py +40 -37
- disdrodb/cli/disdrodb_run_station.py +184 -0
- disdrodb/cli/disdrodb_upload_archive.py +45 -35
- disdrodb/cli/disdrodb_upload_station.py +39 -32
- disdrodb/configs.py +13 -8
- disdrodb/constants.py +4 -2
- disdrodb/data_transfer/__init__.py +1 -3
- disdrodb/data_transfer/download_data.py +38 -54
- disdrodb/data_transfer/upload_data.py +1 -3
- disdrodb/data_transfer/zenodo.py +1 -3
- disdrodb/docs.py +1 -3
- disdrodb/etc/configs/attributes.yaml +52 -2
- disdrodb/etc/configs/encodings.yaml +45 -1
- disdrodb/etc/products/L0C/ODM470/global.yaml +5 -0
- disdrodb/etc/products/L0C/global.yaml +5 -0
- disdrodb/etc/products/L1/ODM470/global.yaml +6 -0
- disdrodb/etc/products/L1/global.yaml +1 -14
- disdrodb/etc/products/L2E/LPM/1MIN.yaml +1 -0
- disdrodb/etc/products/L2E/LPM/global.yaml +36 -0
- disdrodb/etc/products/L2E/LPM_V0/1MIN.yaml +1 -0
- disdrodb/etc/products/L2E/LPM_V0/global.yaml +36 -0
- disdrodb/etc/products/L2E/ODM470/1MIN.yaml +1 -0
- disdrodb/etc/products/L2E/ODM470/global.yaml +36 -0
- disdrodb/etc/products/L2E/PARSIVEL/1MIN.yaml +1 -0
- disdrodb/etc/products/L2E/PARSIVEL/global.yaml +36 -0
- disdrodb/etc/products/L2E/PARSIVEL2/1MIN.yaml +1 -0
- disdrodb/etc/products/L2E/PARSIVEL2/global.yaml +36 -0
- disdrodb/etc/products/L2E/PWS100/1MIN.yaml +1 -0
- disdrodb/etc/products/L2E/PWS100/global.yaml +36 -0
- disdrodb/etc/products/L2E/RD80/1MIN.yaml +19 -0
- disdrodb/etc/products/L2E/SWS250/1MIN.yaml +19 -0
- disdrodb/etc/products/L2E/global.yaml +17 -3
- disdrodb/etc/products/L2M/global.yaml +1 -1
- disdrodb/fall_velocity/__init__.py +46 -0
- disdrodb/fall_velocity/graupel.py +483 -0
- disdrodb/fall_velocity/hail.py +287 -0
- disdrodb/{l1/fall_velocity.py → fall_velocity/rain.py} +265 -50
- disdrodb/issue/__init__.py +1 -3
- disdrodb/issue/checks.py +3 -5
- disdrodb/issue/reader.py +1 -3
- disdrodb/issue/writer.py +1 -3
- disdrodb/l0/__init__.py +1 -1
- disdrodb/l0/check_configs.py +26 -17
- disdrodb/l0/check_standards.py +1 -3
- disdrodb/l0/configs/LPM/l0a_encodings.yml +0 -1
- disdrodb/l0/configs/LPM/l0b_cf_attrs.yml +0 -4
- disdrodb/l0/configs/LPM/l0b_encodings.yml +9 -9
- disdrodb/l0/configs/LPM/raw_data_format.yml +11 -11
- disdrodb/l0/configs/LPM_V0/bins_diameter.yml +103 -0
- disdrodb/l0/configs/LPM_V0/bins_velocity.yml +103 -0
- disdrodb/l0/configs/LPM_V0/l0a_encodings.yml +45 -0
- disdrodb/l0/configs/LPM_V0/l0b_cf_attrs.yml +180 -0
- disdrodb/l0/configs/LPM_V0/l0b_encodings.yml +410 -0
- disdrodb/l0/configs/LPM_V0/raw_data_format.yml +474 -0
- disdrodb/l0/configs/ODM470/bins_diameter.yml +643 -0
- disdrodb/l0/configs/ODM470/bins_velocity.yml +0 -0
- disdrodb/l0/configs/ODM470/l0a_encodings.yml +11 -0
- disdrodb/l0/configs/ODM470/l0b_cf_attrs.yml +46 -0
- disdrodb/l0/configs/ODM470/l0b_encodings.yml +106 -0
- disdrodb/l0/configs/ODM470/raw_data_format.yml +111 -0
- disdrodb/l0/configs/PARSIVEL/l0b_cf_attrs.yml +1 -1
- disdrodb/l0/configs/PARSIVEL/raw_data_format.yml +8 -8
- disdrodb/l0/configs/PARSIVEL2/raw_data_format.yml +9 -9
- disdrodb/l0/l0_reader.py +1 -3
- disdrodb/l0/l0a_processing.py +7 -5
- disdrodb/l0/l0b_nc_processing.py +2 -4
- disdrodb/l0/l0b_processing.py +27 -22
- disdrodb/l0/l0c_processing.py +37 -11
- disdrodb/l0/manuals/LPM_V0.pdf +0 -0
- disdrodb/l0/readers/LPM/ARM/ARM_LPM.py +1 -1
- disdrodb/l0/readers/LPM/AUSTRALIA/MELBOURNE_2007_LPM.py +1 -1
- disdrodb/l0/readers/LPM/BRAZIL/CHUVA_LPM.py +1 -1
- disdrodb/l0/readers/LPM/BRAZIL/GOAMAZON_LPM.py +1 -1
- disdrodb/l0/readers/LPM/GERMANY/DWD.py +190 -12
- disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +63 -14
- disdrodb/l0/readers/LPM/ITALY/GID_LPM_PI.py +279 -0
- disdrodb/l0/readers/LPM/ITALY/GID_LPM_T.py +279 -0
- disdrodb/l0/readers/LPM/ITALY/GID_LPM_W.py +3 -5
- disdrodb/l0/readers/LPM/KIT/CHWALA.py +1 -3
- disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_LPM_NC.py +1 -1
- disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_RWANDA_LPM_NC.py +103 -0
- disdrodb/l0/readers/LPM/NORWAY/HAUKELISETER_LPM.py +214 -0
- disdrodb/l0/readers/LPM/NORWAY/NMBU_LPM.py +206 -0
- disdrodb/l0/readers/LPM/SLOVENIA/ARSO.py +1 -3
- disdrodb/l0/readers/LPM/SLOVENIA/UL.py +1 -3
- disdrodb/l0/readers/LPM/SWITZERLAND/INNERERIZ_LPM.py +1 -3
- disdrodb/l0/readers/LPM/UK/DIVEN.py +1 -1
- disdrodb/l0/readers/LPM/UK/WITHWORTH_LPM.py +217 -0
- disdrodb/l0/readers/LPM/USA/CHARLESTON.py +227 -0
- disdrodb/l0/readers/{LPM → LPM_V0}/BELGIUM/ULIEGE.py +34 -52
- disdrodb/l0/readers/LPM_V0/ITALY/GID_LPM_V0.py +240 -0
- disdrodb/l0/readers/ODM470/OCEAN/OCEANRAIN.py +123 -0
- disdrodb/l0/readers/PARSIVEL/AUSTRALIA/MELBOURNE_2007_PARSIVEL.py +1 -1
- disdrodb/l0/readers/PARSIVEL/BASQUECOUNTRY/EUSKALMET_OTT.py +1 -1
- disdrodb/l0/readers/PARSIVEL/CHINA/CHONGQING.py +1 -3
- disdrodb/l0/readers/PARSIVEL/EPFL/ARCTIC_2021.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/COMMON_2011.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/DAVOS_2009_2011.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_2009.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2008.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2010.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2011.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2012.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/GENEPI_2007.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007_2.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/HPICONET_2010.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP2.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP3.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP4.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2018.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2019.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/PARADISO_2014.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/PARSIVEL_2007.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/PLATO_2019.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019_WJF.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/RIETHOLZBACH_2011.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2017.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2019.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/UNIL_2022.py +1 -1
- disdrodb/l0/readers/PARSIVEL/JAPAN/JMA.py +1 -1
- disdrodb/l0/readers/PARSIVEL/KOREA/ICEPOP_MSC.py +159 -0
- disdrodb/l0/readers/PARSIVEL/NASA/LPVEX.py +26 -14
- disdrodb/l0/readers/PARSIVEL/NASA/MC3E.py +2 -2
- disdrodb/l0/readers/PARSIVEL/NCAR/CCOPE_2015.py +1 -1
- disdrodb/l0/readers/PARSIVEL/NCAR/OWLES_MIPS.py +1 -1
- disdrodb/l0/readers/PARSIVEL/NCAR/PECAN_MOBILE.py +1 -1
- disdrodb/l0/readers/PARSIVEL/NCAR/PLOWS_MIPS.py +1 -1
- disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2009.py +1 -1
- disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010.py +1 -3
- disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010_UF.py +1 -3
- disdrodb/l0/readers/PARSIVEL/SLOVENIA/UL.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/ARM/ARM_PARSIVEL2.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/BASQUECOUNTRY/EUSKALMET_OTT2.py +2 -2
- disdrodb/l0/readers/PARSIVEL2/BELGIUM/ILVO.py +1 -3
- disdrodb/l0/readers/PARSIVEL2/BRAZIL/CHUVA_PARSIVEL2.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/BRAZIL/GOAMAZON_PARSIVEL2.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/CANADA/UQAM_NC.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/DENMARK/DTU.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_nc.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_raw.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/FINLAND/FMI_PARSIVEL2.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/FRANCE/ENPC_PARSIVEL2.py +1 -3
- disdrodb/l0/readers/PARSIVEL2/FRANCE/OSUG.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/FRANCE/SIRTA_PARSIVEL2.py +1 -3
- disdrodb/l0/readers/PARSIVEL2/GREECE/NOA.py +4 -3
- disdrodb/l0/readers/PARSIVEL2/ITALY/GID_PARSIVEL2.py +1 -3
- disdrodb/l0/readers/PARSIVEL2/ITALY/HYDROX.py +5 -3
- disdrodb/l0/readers/PARSIVEL2/JAPAN/PRECIP.py +155 -0
- disdrodb/l0/readers/PARSIVEL2/KIT/BURKINA_FASO.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/KIT/TEAMX.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/KOREA/ICEPOP_MSC.py +161 -0
- disdrodb/l0/readers/PARSIVEL2/{NASA/GCPEX.py → KOREA/ICEPOP_UCLM.py} +51 -31
- disdrodb/l0/readers/PARSIVEL2/MEXICO/OH_IIUNAM_nc.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/MPI/BCO_PARSIVEL2.py +15 -8
- disdrodb/l0/readers/PARSIVEL2/MPI/BOWTIE.py +9 -4
- disdrodb/l0/readers/PARSIVEL2/NASA/APU.py +31 -6
- disdrodb/l0/readers/PARSIVEL2/NASA/NSSTC.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/FARM_PARSIVEL2.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_FP3.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_MIPS.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_MIPS.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_PIPS.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +2 -2
- disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_PJ.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_SB.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P1.py +1 -3
- disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P2.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT_NC.py +1 -1
- disdrodb/l0/readers/{PARSIVEL/NASA/PIERS.py → PARSIVEL2/NORWAY/UIB.py} +65 -31
- disdrodb/l0/readers/PARSIVEL2/PHILIPPINES/PAGASA.py +7 -6
- disdrodb/l0/readers/PARSIVEL2/SPAIN/CENER.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/SPAIN/CR1000DL.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/SPAIN/GRANADA.py +1 -3
- disdrodb/l0/readers/PARSIVEL2/SPAIN/LIAISE.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/SWEDEN/SMHI.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/USA/CSU.py +138 -0
- disdrodb/l0/readers/PARSIVEL2/USA/CW3E.py +49 -22
- disdrodb/l0/readers/PWS100/AUSTRIA/HOAL.py +1 -3
- disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100.py +1 -3
- disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100_SIRTA.py +1 -1
- disdrodb/l0/readers/{PARSIVEL/NASA/IFLOODS.py → RD80/BRAZIL/ATTO_RD80.py} +50 -36
- disdrodb/l0/readers/RD80/BRAZIL/CHUVA_RD80.py +1 -3
- disdrodb/l0/readers/RD80/BRAZIL/GOAMAZON_RD80.py +1 -3
- disdrodb/l0/readers/RD80/NCAR/CINDY_2011_RD80.py +1 -3
- disdrodb/l0/readers/RD80/NCAR/RELAMPAGO_RD80.py +1 -3
- disdrodb/l0/readers/RD80/NOAA/PSL_RD80.py +1 -3
- disdrodb/l0/readers/{SW250 → SWS250}/BELGIUM/KMI.py +2 -4
- disdrodb/l0/readers/template_reader_raw_netcdf_data.py +1 -3
- disdrodb/l0/readers/template_reader_raw_text_data.py +1 -3
- disdrodb/l0/standards.py +4 -5
- disdrodb/l0/template_tools.py +1 -3
- disdrodb/l1/__init__.py +1 -1
- disdrodb/l1/classification.py +913 -0
- disdrodb/l1/processing.py +36 -106
- disdrodb/l1/resampling.py +8 -3
- disdrodb/l1_env/__init__.py +1 -1
- disdrodb/l1_env/routines.py +6 -6
- disdrodb/l2/__init__.py +1 -1
- disdrodb/l2/empirical_dsd.py +61 -31
- disdrodb/l2/processing.py +327 -62
- disdrodb/metadata/checks.py +1 -3
- disdrodb/metadata/download.py +4 -4
- disdrodb/metadata/geolocation.py +1 -3
- disdrodb/metadata/info.py +1 -3
- disdrodb/metadata/manipulation.py +1 -3
- disdrodb/metadata/reader.py +1 -3
- disdrodb/metadata/search.py +1 -3
- disdrodb/metadata/standards.py +1 -3
- disdrodb/metadata/writer.py +1 -3
- disdrodb/physics/__init__.py +17 -0
- disdrodb/physics/atmosphere.py +272 -0
- disdrodb/physics/water.py +130 -0
- disdrodb/physics/wrappers.py +62 -0
- disdrodb/psd/__init__.py +1 -1
- disdrodb/psd/fitting.py +22 -9
- disdrodb/psd/models.py +1 -1
- disdrodb/routines/__init__.py +5 -1
- disdrodb/routines/l0.py +28 -18
- disdrodb/routines/l1.py +8 -6
- disdrodb/routines/l2.py +8 -4
- disdrodb/routines/options.py +116 -71
- disdrodb/routines/options_validation.py +728 -0
- disdrodb/routines/wrappers.py +431 -11
- disdrodb/scattering/__init__.py +1 -1
- disdrodb/scattering/axis_ratio.py +9 -6
- disdrodb/scattering/permittivity.py +8 -8
- disdrodb/scattering/routines.py +32 -14
- disdrodb/summary/__init__.py +1 -1
- disdrodb/summary/routines.py +146 -86
- disdrodb/utils/__init__.py +1 -1
- disdrodb/utils/archiving.py +16 -9
- disdrodb/utils/attrs.py +4 -3
- disdrodb/utils/cli.py +8 -10
- disdrodb/utils/compression.py +13 -13
- disdrodb/utils/dask.py +33 -14
- disdrodb/utils/dataframe.py +1 -3
- disdrodb/utils/decorators.py +1 -3
- disdrodb/utils/dict.py +1 -1
- disdrodb/utils/directories.py +3 -5
- disdrodb/utils/encoding.py +2 -4
- disdrodb/utils/event.py +1 -1
- disdrodb/utils/list.py +1 -3
- disdrodb/utils/logger.py +1 -3
- disdrodb/utils/manipulations.py +182 -6
- disdrodb/utils/pydantic.py +80 -0
- disdrodb/utils/routines.py +1 -3
- disdrodb/utils/subsetting.py +1 -1
- disdrodb/utils/time.py +3 -2
- disdrodb/utils/warnings.py +1 -3
- disdrodb/utils/writer.py +1 -3
- disdrodb/utils/xarray.py +30 -3
- disdrodb/utils/yaml.py +1 -3
- disdrodb/viz/__init__.py +1 -1
- disdrodb/viz/plots.py +197 -21
- {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/METADATA +2 -2
- disdrodb-0.3.0.dist-info/RECORD +358 -0
- {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/entry_points.txt +3 -0
- disdrodb/etc/products/L1/1MIN.yaml +0 -13
- disdrodb/etc/products/L1/LPM/1MIN.yaml +0 -13
- disdrodb/etc/products/L1/PARSIVEL/1MIN.yaml +0 -13
- disdrodb/etc/products/L1/PARSIVEL2/1MIN.yaml +0 -13
- disdrodb/etc/products/L1/PWS100/1MIN.yaml +0 -13
- disdrodb/etc/products/L1/RD80/1MIN.yaml +0 -13
- disdrodb/etc/products/L1/SWS250/1MIN.yaml +0 -13
- disdrodb/etc/products/L2M/10MIN.yaml +0 -12
- disdrodb/l1/beard_model.py +0 -618
- disdrodb/l1/filters.py +0 -203
- disdrodb-0.2.0.dist-info/RECORD +0 -312
- {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/WHEEL +0 -0
- {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/licenses/LICENSE +0 -0
- {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
precipitation_rate:
|
|
2
|
+
dtype: float32
|
|
3
|
+
zlib: true
|
|
4
|
+
complevel: 3
|
|
5
|
+
shuffle: true
|
|
6
|
+
fletcher32: false
|
|
7
|
+
contiguous: false
|
|
8
|
+
chunksizes: 43200
|
|
9
|
+
precip_flag:
|
|
10
|
+
dtype: int8
|
|
11
|
+
zlib: true
|
|
12
|
+
complevel: 3
|
|
13
|
+
shuffle: true
|
|
14
|
+
fletcher32: false
|
|
15
|
+
contiguous: false
|
|
16
|
+
chunksizes: 43200
|
|
17
|
+
_FillValue: 127
|
|
18
|
+
reference_voltage:
|
|
19
|
+
dtype: float32
|
|
20
|
+
zlib: true
|
|
21
|
+
complevel: 3
|
|
22
|
+
shuffle: true
|
|
23
|
+
fletcher32: false
|
|
24
|
+
contiguous: false
|
|
25
|
+
chunksizes: 43200
|
|
26
|
+
weather_code_synop_4677:
|
|
27
|
+
dtype: uint8
|
|
28
|
+
zlib: true
|
|
29
|
+
complevel: 3
|
|
30
|
+
shuffle: true
|
|
31
|
+
fletcher32: false
|
|
32
|
+
contiguous: false
|
|
33
|
+
chunksizes: 5000
|
|
34
|
+
_FillValue: 255
|
|
35
|
+
relative_wind_speed:
|
|
36
|
+
dtype: uint16
|
|
37
|
+
scale_factor: 0.1
|
|
38
|
+
add_offset: -99.9
|
|
39
|
+
zlib: true
|
|
40
|
+
complevel: 3
|
|
41
|
+
shuffle: true
|
|
42
|
+
fletcher32: false
|
|
43
|
+
contiguous: false
|
|
44
|
+
_FillValue: 65535
|
|
45
|
+
chunksizes: 43200
|
|
46
|
+
relative_wind_direction:
|
|
47
|
+
dtype: uint16
|
|
48
|
+
zlib: true
|
|
49
|
+
complevel: 3
|
|
50
|
+
shuffle: true
|
|
51
|
+
fletcher32: false
|
|
52
|
+
contiguous: false
|
|
53
|
+
_FillValue: 65535
|
|
54
|
+
chunksizes: 43200
|
|
55
|
+
raw_drop_number:
|
|
56
|
+
dtype: uint16
|
|
57
|
+
zlib: true
|
|
58
|
+
complevel: 3
|
|
59
|
+
shuffle: true
|
|
60
|
+
fletcher32: false
|
|
61
|
+
contiguous: false
|
|
62
|
+
_FillValue: 65535
|
|
63
|
+
chunksizes:
|
|
64
|
+
- 43200
|
|
65
|
+
- 128
|
|
66
|
+
air_temperature:
|
|
67
|
+
dtype: uint16
|
|
68
|
+
scale_factor: 0.1
|
|
69
|
+
add_offset: -99.9
|
|
70
|
+
zlib: true
|
|
71
|
+
complevel: 3
|
|
72
|
+
shuffle: true
|
|
73
|
+
fletcher32: false
|
|
74
|
+
contiguous: false
|
|
75
|
+
_FillValue: 65535
|
|
76
|
+
chunksizes: 43200
|
|
77
|
+
relative_humidity:
|
|
78
|
+
dtype: uint16
|
|
79
|
+
scale_factor: 0.01
|
|
80
|
+
zlib: true
|
|
81
|
+
complevel: 3
|
|
82
|
+
shuffle: true
|
|
83
|
+
fletcher32: false
|
|
84
|
+
contiguous: false
|
|
85
|
+
_FillValue: 65535
|
|
86
|
+
chunksizes: 43200
|
|
87
|
+
wind_speed:
|
|
88
|
+
dtype: uint16
|
|
89
|
+
scale_factor: 0.1
|
|
90
|
+
add_offset: -99.9
|
|
91
|
+
zlib: true
|
|
92
|
+
complevel: 3
|
|
93
|
+
shuffle: true
|
|
94
|
+
fletcher32: false
|
|
95
|
+
contiguous: false
|
|
96
|
+
_FillValue: 65535
|
|
97
|
+
chunksizes: 43200
|
|
98
|
+
wind_direction:
|
|
99
|
+
dtype: uint16
|
|
100
|
+
zlib: true
|
|
101
|
+
complevel: 3
|
|
102
|
+
shuffle: true
|
|
103
|
+
fletcher32: false
|
|
104
|
+
contiguous: false
|
|
105
|
+
_FillValue: 65535
|
|
106
|
+
chunksizes: 43200
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
precipitation_rate:
|
|
2
|
+
n_digits: 6
|
|
3
|
+
n_characters: 7
|
|
4
|
+
n_decimals: 3
|
|
5
|
+
n_naturals: 3
|
|
6
|
+
data_range:
|
|
7
|
+
- 0.0
|
|
8
|
+
- 999.999
|
|
9
|
+
nan_flags: null
|
|
10
|
+
field_number: "1"
|
|
11
|
+
reference_voltage:
|
|
12
|
+
n_digits: 6
|
|
13
|
+
n_characters: 7
|
|
14
|
+
n_decimals: 3
|
|
15
|
+
n_naturals: 3
|
|
16
|
+
data_range:
|
|
17
|
+
- 0.0
|
|
18
|
+
- 5.5
|
|
19
|
+
nan_flags: null
|
|
20
|
+
field_number: "2"
|
|
21
|
+
relative_wind_speed:
|
|
22
|
+
n_digits: 6
|
|
23
|
+
n_characters: 7
|
|
24
|
+
n_decimals: 3
|
|
25
|
+
n_naturals: 3
|
|
26
|
+
data_range:
|
|
27
|
+
- 0.0
|
|
28
|
+
- 100
|
|
29
|
+
nan_flags: null
|
|
30
|
+
field_number: "3"
|
|
31
|
+
relative_wind_direction:
|
|
32
|
+
n_digits: 6
|
|
33
|
+
n_characters: 7
|
|
34
|
+
n_decimals: 3
|
|
35
|
+
n_naturals: 3
|
|
36
|
+
data_range:
|
|
37
|
+
- 0.0
|
|
38
|
+
- 360
|
|
39
|
+
nan_flags: null
|
|
40
|
+
field_number: "4"
|
|
41
|
+
precip_flag:
|
|
42
|
+
n_digits: 1
|
|
43
|
+
n_characters: 1
|
|
44
|
+
n_decimals: 0
|
|
45
|
+
n_naturals: 0
|
|
46
|
+
data_range:
|
|
47
|
+
- -1
|
|
48
|
+
- 5
|
|
49
|
+
nan_flags: null
|
|
50
|
+
field_number: "5"
|
|
51
|
+
weather_code_synop_4677:
|
|
52
|
+
n_digits: 2
|
|
53
|
+
n_characters: 2
|
|
54
|
+
n_decimals: 0
|
|
55
|
+
n_naturals: 2
|
|
56
|
+
data_range:
|
|
57
|
+
- 0
|
|
58
|
+
- 90
|
|
59
|
+
nan_flags: null
|
|
60
|
+
field_number: "6"
|
|
61
|
+
raw_drop_number:
|
|
62
|
+
n_digits: 1317
|
|
63
|
+
n_characters: 1756
|
|
64
|
+
n_decimals: 1317
|
|
65
|
+
n_naturals: 0
|
|
66
|
+
data_range: null
|
|
67
|
+
nan_flags: null
|
|
68
|
+
dimension_order:
|
|
69
|
+
- diameter_bin_center
|
|
70
|
+
n_values: 128
|
|
71
|
+
field_number: "81"
|
|
72
|
+
air_temperature:
|
|
73
|
+
n_digits: 4
|
|
74
|
+
n_characters: 5
|
|
75
|
+
n_decimals: 1
|
|
76
|
+
n_naturals: 2
|
|
77
|
+
data_range:
|
|
78
|
+
- -40
|
|
79
|
+
- 70
|
|
80
|
+
nan_flags: 99999
|
|
81
|
+
field_number: "521"
|
|
82
|
+
relative_humidity:
|
|
83
|
+
n_digits: 5
|
|
84
|
+
n_characters: 5
|
|
85
|
+
n_decimals: 0
|
|
86
|
+
n_naturals: 5
|
|
87
|
+
data_range:
|
|
88
|
+
- 0
|
|
89
|
+
- 99999
|
|
90
|
+
nan_flags: 99999
|
|
91
|
+
field_number: "522"
|
|
92
|
+
wind_speed:
|
|
93
|
+
n_digits: 3
|
|
94
|
+
n_characters: 4
|
|
95
|
+
n_decimals: 1
|
|
96
|
+
n_naturals: 2
|
|
97
|
+
data_range:
|
|
98
|
+
- 0
|
|
99
|
+
- 60
|
|
100
|
+
nan_flags: null
|
|
101
|
+
field_number: "523"
|
|
102
|
+
wind_direction:
|
|
103
|
+
n_digits: 3
|
|
104
|
+
n_characters: 3
|
|
105
|
+
n_decimals: 0
|
|
106
|
+
n_naturals: 3
|
|
107
|
+
data_range:
|
|
108
|
+
- 0
|
|
109
|
+
- 360
|
|
110
|
+
nan_flags: 999
|
|
111
|
+
field_number: "524"
|
|
@@ -121,7 +121,7 @@ reflectivity_16bit:
|
|
|
121
121
|
raw_drop_concentration:
|
|
122
122
|
description: Particle number concentrations per diameter class
|
|
123
123
|
long_name: Raw drop concentration
|
|
124
|
-
units: 1/(m3*mm)
|
|
124
|
+
units: log10 1/(m3*mm)
|
|
125
125
|
raw_drop_average_velocity:
|
|
126
126
|
description: Average particle velocities for each diameter class
|
|
127
127
|
long_name: Raw drop average velocity
|
|
@@ -6,7 +6,7 @@ rainfall_rate_32bit:
|
|
|
6
6
|
data_range:
|
|
7
7
|
- 0
|
|
8
8
|
- 9999.999
|
|
9
|
-
nan_flags:
|
|
9
|
+
nan_flags: 9999.999
|
|
10
10
|
field_number: "01"
|
|
11
11
|
rainfall_accumulated_32bit:
|
|
12
12
|
n_digits: 6
|
|
@@ -16,7 +16,7 @@ rainfall_accumulated_32bit:
|
|
|
16
16
|
data_range:
|
|
17
17
|
- 0
|
|
18
18
|
- 9999.0
|
|
19
|
-
nan_flags:
|
|
19
|
+
nan_flags: 9999.0
|
|
20
20
|
field_number: "02"
|
|
21
21
|
weather_code_synop_4680:
|
|
22
22
|
n_digits: 2
|
|
@@ -62,7 +62,7 @@ reflectivity_32bit:
|
|
|
62
62
|
data_range:
|
|
63
63
|
- -9.999
|
|
64
64
|
- 99.999
|
|
65
|
-
nan_flags:
|
|
65
|
+
nan_flags: 99.999
|
|
66
66
|
field_number: "07"
|
|
67
67
|
mor_visibility:
|
|
68
68
|
n_digits: 4
|
|
@@ -92,7 +92,7 @@ laser_amplitude:
|
|
|
92
92
|
data_range:
|
|
93
93
|
- 0
|
|
94
94
|
- 99999
|
|
95
|
-
nan_flags:
|
|
95
|
+
nan_flags: 99999
|
|
96
96
|
field_number: "10"
|
|
97
97
|
number_particles:
|
|
98
98
|
n_digits: 5
|
|
@@ -102,7 +102,7 @@ number_particles:
|
|
|
102
102
|
data_range:
|
|
103
103
|
- 0
|
|
104
104
|
- 99999
|
|
105
|
-
nan_flags:
|
|
105
|
+
nan_flags: 99999
|
|
106
106
|
field_number: "11"
|
|
107
107
|
sensor_temperature:
|
|
108
108
|
n_digits: 3
|
|
@@ -221,7 +221,7 @@ rainfall_amount_absolute_32bit:
|
|
|
221
221
|
data_range:
|
|
222
222
|
- 0
|
|
223
223
|
- 999.999
|
|
224
|
-
nan_flags:
|
|
224
|
+
nan_flags: 999.999
|
|
225
225
|
field_number: "24"
|
|
226
226
|
error_code:
|
|
227
227
|
n_digits: 3
|
|
@@ -245,7 +245,7 @@ rainfall_rate_16bit:
|
|
|
245
245
|
data_range:
|
|
246
246
|
- 0
|
|
247
247
|
- 9999.999
|
|
248
|
-
nan_flags:
|
|
248
|
+
nan_flags: 9999.999
|
|
249
249
|
field_number: "30"
|
|
250
250
|
rainfall_rate_12bit:
|
|
251
251
|
n_digits: 5
|
|
@@ -273,7 +273,7 @@ reflectivity_16bit:
|
|
|
273
273
|
data_range:
|
|
274
274
|
- -9.99
|
|
275
275
|
- 99.99
|
|
276
|
-
nan_flags:
|
|
276
|
+
nan_flags: 99.99
|
|
277
277
|
field_number: "33"
|
|
278
278
|
raw_drop_concentration:
|
|
279
279
|
n_digits: 0
|
|
@@ -6,7 +6,7 @@ rainfall_rate_32bit:
|
|
|
6
6
|
data_range:
|
|
7
7
|
- 0
|
|
8
8
|
- 9999.999
|
|
9
|
-
nan_flags:
|
|
9
|
+
nan_flags: 9999.999
|
|
10
10
|
field_number: "01"
|
|
11
11
|
rainfall_accumulated_32bit:
|
|
12
12
|
n_digits: 6
|
|
@@ -16,7 +16,7 @@ rainfall_accumulated_32bit:
|
|
|
16
16
|
data_range:
|
|
17
17
|
- 0
|
|
18
18
|
- 9999.0
|
|
19
|
-
nan_flags:
|
|
19
|
+
nan_flags: 9999.0
|
|
20
20
|
field_number: "02"
|
|
21
21
|
weather_code_synop_4680:
|
|
22
22
|
n_digits: 2
|
|
@@ -62,7 +62,7 @@ reflectivity_32bit:
|
|
|
62
62
|
data_range:
|
|
63
63
|
- -9.999
|
|
64
64
|
- 99.999
|
|
65
|
-
nan_flags:
|
|
65
|
+
nan_flags: 99.999
|
|
66
66
|
field_number: "07"
|
|
67
67
|
mor_visibility:
|
|
68
68
|
n_digits: 5
|
|
@@ -92,7 +92,7 @@ laser_amplitude:
|
|
|
92
92
|
data_range:
|
|
93
93
|
- 0
|
|
94
94
|
- 99999
|
|
95
|
-
nan_flags:
|
|
95
|
+
nan_flags: 99999
|
|
96
96
|
field_number: "10"
|
|
97
97
|
number_particles:
|
|
98
98
|
n_digits: 5
|
|
@@ -102,7 +102,7 @@ number_particles:
|
|
|
102
102
|
data_range:
|
|
103
103
|
- 0
|
|
104
104
|
- 99999
|
|
105
|
-
nan_flags:
|
|
105
|
+
nan_flags: 99999
|
|
106
106
|
field_number: "11"
|
|
107
107
|
sensor_temperature:
|
|
108
108
|
n_digits: 3
|
|
@@ -221,7 +221,7 @@ rainfall_amount_absolute_32bit:
|
|
|
221
221
|
data_range:
|
|
222
222
|
- 0
|
|
223
223
|
- 999.999
|
|
224
|
-
nan_flags:
|
|
224
|
+
nan_flags: 999.999
|
|
225
225
|
field_number: "24"
|
|
226
226
|
error_code:
|
|
227
227
|
n_digits: 3
|
|
@@ -305,7 +305,7 @@ reflectivity_16bit:
|
|
|
305
305
|
data_range:
|
|
306
306
|
- -9.99
|
|
307
307
|
- 99.99
|
|
308
|
-
nan_flags:
|
|
308
|
+
nan_flags: 99.99
|
|
309
309
|
field_number: "33"
|
|
310
310
|
rain_kinetic_energy:
|
|
311
311
|
n_digits: 6
|
|
@@ -315,7 +315,7 @@ rain_kinetic_energy:
|
|
|
315
315
|
data_range:
|
|
316
316
|
- 0
|
|
317
317
|
- 9999.99
|
|
318
|
-
nan_flags:
|
|
318
|
+
nan_flags: 9999.99
|
|
319
319
|
field_number: "34"
|
|
320
320
|
snowfall_rate:
|
|
321
321
|
n_digits: 6
|
|
@@ -325,7 +325,7 @@ snowfall_rate:
|
|
|
325
325
|
data_range:
|
|
326
326
|
- 0
|
|
327
327
|
- 999.999
|
|
328
|
-
nan_flags:
|
|
328
|
+
nan_flags: 999.999
|
|
329
329
|
field_number: "35"
|
|
330
330
|
number_particles_all:
|
|
331
331
|
n_digits: 8
|
disdrodb/l0/l0_reader.py
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
1
|
# -----------------------------------------------------------------------------.
|
|
4
|
-
# Copyright (c) 2021-
|
|
2
|
+
# Copyright (c) 2021-2026 DISDRODB developers
|
|
5
3
|
#
|
|
6
4
|
# This program is free software: you can redistribute it and/or modify
|
|
7
5
|
# it under the terms of the GNU General Public License as published by
|
disdrodb/l0/l0a_processing.py
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
1
|
# -----------------------------------------------------------------------------.
|
|
4
|
-
# Copyright (c) 2021-
|
|
2
|
+
# Copyright (c) 2021-2026 DISDRODB developers
|
|
5
3
|
#
|
|
6
4
|
# This program is free software: you can redistribute it and/or modify
|
|
7
5
|
# it under the terms of the GNU General Public License as published by
|
|
@@ -267,8 +265,8 @@ def remove_issue_timesteps(df, issue_dict, logger=None, verbose=False):
|
|
|
267
265
|
n_initial_rows = len(df)
|
|
268
266
|
|
|
269
267
|
# Retrieve timesteps and time_periods
|
|
270
|
-
timesteps = issue_dict.get("timesteps"
|
|
271
|
-
time_periods = issue_dict.get("time_periods"
|
|
268
|
+
timesteps = issue_dict.get("timesteps")
|
|
269
|
+
time_periods = issue_dict.get("time_periods")
|
|
272
270
|
timesteps = [] if timesteps is None else timesteps
|
|
273
271
|
time_periods = [] if time_periods is None else time_periods
|
|
274
272
|
|
|
@@ -615,6 +613,10 @@ def sanitize_df(
|
|
|
615
613
|
# - Strip first and last delimiter from the raw arrays
|
|
616
614
|
df = strip_delimiter_from_raw_arrays(df)
|
|
617
615
|
|
|
616
|
+
# - Ensure raw drop number variable max value is < 999
|
|
617
|
+
# - Raise error otherwise
|
|
618
|
+
# TODO:
|
|
619
|
+
|
|
618
620
|
# - Remove corrupted rows
|
|
619
621
|
df = remove_corrupted_rows(df)
|
|
620
622
|
|
disdrodb/l0/l0b_nc_processing.py
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
1
|
# -----------------------------------------------------------------------------.
|
|
4
|
-
# Copyright (c) 2021-
|
|
2
|
+
# Copyright (c) 2021-2026 DISDRODB developers
|
|
5
3
|
#
|
|
6
4
|
# This program is free software: you can redistribute it and/or modify
|
|
7
5
|
# it under the terms of the GNU General Public License as published by
|
|
@@ -50,7 +48,7 @@ def _check_dict_names_validity(dict_names, sensor_name):
|
|
|
50
48
|
keys = np.array(list(dict_names.keys()))
|
|
51
49
|
values = np.array(list(dict_names.values()))
|
|
52
50
|
# Get invalid keys
|
|
53
|
-
invalid_keys = keys[np.isin(values, valid_names, invert=True)]
|
|
51
|
+
invalid_keys = keys[np.isin(values, valid_names, invert=True)].tolist()
|
|
54
52
|
if len(invalid_keys) > 0:
|
|
55
53
|
# Report invalid keys and raise error
|
|
56
54
|
invalid_dict = {k: dict_names[k] for k in invalid_keys}
|
disdrodb/l0/l0b_processing.py
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
1
|
# -----------------------------------------------------------------------------.
|
|
4
|
-
# Copyright (c) 2021-
|
|
2
|
+
# Copyright (c) 2021-2026 DISDRODB developers
|
|
5
3
|
#
|
|
6
4
|
# This program is free software: you can redistribute it and/or modify
|
|
7
5
|
# it under the terms of the GNU General Public License as published by
|
|
@@ -91,7 +89,7 @@ def format_string_array(string: str, n_values: int) -> np.array:
|
|
|
91
89
|
|
|
92
90
|
e.g. : format_string_array("2,44,22,33", 4) will return [ 2. 44. 22. 33.]
|
|
93
91
|
|
|
94
|
-
If empty string ("") --> Return an arrays of zeros
|
|
92
|
+
If empty string ("") or "" --> Return an arrays of zeros
|
|
95
93
|
If the list length is not n_values -> Return an arrays of np.nan
|
|
96
94
|
|
|
97
95
|
The function strip potential delimiters at start and end before splitting.
|
|
@@ -108,31 +106,38 @@ def format_string_array(string: str, n_values: int) -> np.array:
|
|
|
108
106
|
np.array
|
|
109
107
|
array of float
|
|
110
108
|
"""
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
# -------------------------------------------------------------------------.
|
|
115
|
-
## Assumptions !!!
|
|
116
|
-
# If empty list --> Assume no precipitation recorded. Return an arrays of zeros
|
|
117
|
-
if len(values) == 0:
|
|
109
|
+
# Check for empty string or "0" case
|
|
110
|
+
# - Assume no precipitation recorded. Return an arrays of zeros
|
|
111
|
+
if string in {"", "0"}:
|
|
118
112
|
values = np.zeros(n_values)
|
|
119
113
|
return values
|
|
120
114
|
|
|
121
|
-
#
|
|
115
|
+
# Check for NaN case
|
|
116
|
+
# - Assume no data available. Return an arrays of NaN
|
|
117
|
+
if string == "NaN":
|
|
118
|
+
values = np.zeros(n_values) * np.nan
|
|
119
|
+
return values
|
|
120
|
+
|
|
121
|
+
# Retrieve list of values
|
|
122
|
+
split_str = infer_split_str(string)
|
|
123
|
+
values = np.array(string.strip(split_str).split(split_str))
|
|
124
|
+
|
|
122
125
|
# If the length is not as expected --> Assume data corruption
|
|
123
126
|
# --> Return an array with nan
|
|
124
127
|
if len(values) != n_values:
|
|
125
128
|
values = np.zeros(n_values) * np.nan
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
129
|
+
return values
|
|
130
|
+
|
|
131
|
+
# Otherwise sanitize the list of value
|
|
132
|
+
# Ensure string type
|
|
133
|
+
values = values.astype("str")
|
|
134
|
+
# Replace '' with 0
|
|
135
|
+
values = replace_empty_strings_with_zeros(values)
|
|
136
|
+
# Replace "-9.999" with 0
|
|
137
|
+
values = np.char.replace(values, "-9.999", "0")
|
|
138
|
+
# Cast values to float type
|
|
139
|
+
# --> Note: the disk encoding is specified in the l0b_encodings.yml
|
|
140
|
+
values = values.astype(float)
|
|
136
141
|
return values
|
|
137
142
|
|
|
138
143
|
|
disdrodb/l0/l0c_processing.py
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
1
|
# -----------------------------------------------------------------------------.
|
|
4
|
-
# Copyright (c) 2021-
|
|
2
|
+
# Copyright (c) 2021-2026 DISDRODB developers
|
|
5
3
|
#
|
|
6
4
|
# This program is free software: you can redistribute it and/or modify
|
|
7
5
|
# it under the terms of the GNU General Public License as published by
|
|
@@ -340,6 +338,20 @@ def get_problematic_timestep_indices(timesteps, sample_interval):
|
|
|
340
338
|
return idx_previous_missing, idx_next_missing, idx_isolated_missing
|
|
341
339
|
|
|
342
340
|
|
|
341
|
+
def nearest_expected_times(times, expected_times):
|
|
342
|
+
"""Return index of nearest expected time."""
|
|
343
|
+
# both must be sorted ascending
|
|
344
|
+
idx = np.searchsorted(expected_times, times)
|
|
345
|
+
idx = np.clip(idx, 1, len(expected_times) - 1)
|
|
346
|
+
|
|
347
|
+
# Compare distance to the previous vs next expected time
|
|
348
|
+
prev = expected_times[idx - 1]
|
|
349
|
+
next_ = expected_times[idx]
|
|
350
|
+
choose_next = (times - prev) > (next_ - times)
|
|
351
|
+
nearest = np.where(choose_next, next_, prev)
|
|
352
|
+
return nearest
|
|
353
|
+
|
|
354
|
+
|
|
343
355
|
def regularize_timesteps(ds, sample_interval, robust=False, add_quality_flag=True, logger=None, verbose=True):
|
|
344
356
|
"""Ensure timesteps match with the sample_interval.
|
|
345
357
|
|
|
@@ -364,13 +376,16 @@ def regularize_timesteps(ds, sample_interval, robust=False, add_quality_flag=Tru
|
|
|
364
376
|
times = times.to_numpy(dtype="M8[s]")
|
|
365
377
|
expected_times = expected_times.to_numpy(dtype="M8[s]")
|
|
366
378
|
|
|
379
|
+
# Vectorized mapping of observed times → nearest expected times
|
|
380
|
+
adjusted_times = nearest_expected_times(times, expected_times)
|
|
381
|
+
|
|
367
382
|
# Map original times to the nearest expected times
|
|
368
|
-
# Calculate the difference between original times and expected times
|
|
369
|
-
time_deltas = np.abs(times - expected_times[:, None]).astype(int)
|
|
383
|
+
# # Calculate the difference between original times and expected times
|
|
384
|
+
# time_deltas = np.abs(times - expected_times[:, None]).astype(int)
|
|
370
385
|
|
|
371
|
-
# Find the index of the closest expected time for each original time
|
|
372
|
-
nearest_indices = np.argmin(time_deltas, axis=0)
|
|
373
|
-
adjusted_times = expected_times[nearest_indices]
|
|
386
|
+
# # Find the index of the closest expected time for each original time
|
|
387
|
+
# nearest_indices = np.argmin(time_deltas, axis=0)
|
|
388
|
+
# adjusted_times = expected_times[nearest_indices]
|
|
374
389
|
|
|
375
390
|
# Check for duplicates in adjusted times
|
|
376
391
|
unique_times, counts = np.unique(adjusted_times, return_counts=True)
|
|
@@ -466,10 +481,10 @@ def regularize_timesteps(ds, sample_interval, robust=False, add_quality_flag=Tru
|
|
|
466
481
|
# qc_flag[-1] = 0
|
|
467
482
|
|
|
468
483
|
# Add time quality flag variable
|
|
469
|
-
ds["
|
|
484
|
+
ds["qc_time"] = xr.DataArray(qc_flag, dims="time")
|
|
470
485
|
|
|
471
|
-
# Add CF attributes for
|
|
472
|
-
ds["
|
|
486
|
+
# Add CF attributes for qc_time
|
|
487
|
+
ds["qc_time"].attrs = {
|
|
473
488
|
"long_name": "time quality flag",
|
|
474
489
|
"standard_name": "status_flag",
|
|
475
490
|
"units": "1",
|
|
@@ -587,6 +602,7 @@ def _finalize_l0c_dataset(ds, sample_interval, sensor_name, verbose=True, logger
|
|
|
587
602
|
ds = add_sample_interval(ds, sample_interval=sample_interval)
|
|
588
603
|
|
|
589
604
|
# Regularize timesteps (for trailing seconds)
|
|
605
|
+
# --> This remove time encoding
|
|
590
606
|
ds = regularize_timesteps(
|
|
591
607
|
ds,
|
|
592
608
|
sample_interval=sample_interval,
|
|
@@ -678,6 +694,16 @@ def create_l0c_datasets(
|
|
|
678
694
|
log_info(logger=logger, msg=f"No data between {start_time} and {end_time}.", verbose=verbose)
|
|
679
695
|
return {}
|
|
680
696
|
|
|
697
|
+
# If 1 or 2 timesteps per time block, return empty dictionary
|
|
698
|
+
n_timesteps = len(ds["time"])
|
|
699
|
+
if n_timesteps < 3:
|
|
700
|
+
log_info(
|
|
701
|
+
logger=logger,
|
|
702
|
+
msg=f"Only {n_timesteps} timesteps between {start_time} and {end_time}.",
|
|
703
|
+
verbose=verbose,
|
|
704
|
+
)
|
|
705
|
+
return {}
|
|
706
|
+
|
|
681
707
|
# ---------------------------------------------------------------------------------------.
|
|
682
708
|
# If sample interval is a dataset variable, drop timesteps with unexpected measurement intervals !
|
|
683
709
|
if "sample_interval" in ds:
|
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -----------------------------------------------------------------------------.
|
|
3
|
-
# Copyright (c) 2021-
|
|
3
|
+
# Copyright (c) 2021-2026 DISDRODB developers
|
|
4
4
|
#
|
|
5
5
|
# This program is free software: you can redistribute it and/or modify
|
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -----------------------------------------------------------------------------.
|
|
3
|
-
# Copyright (c) 2021-
|
|
3
|
+
# Copyright (c) 2021-2026 DISDRODB developers
|
|
4
4
|
#
|
|
5
5
|
# This program is free software: you can redistribute it and/or modify
|
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -----------------------------------------------------------------------------.
|
|
3
|
-
# Copyright (c) 2021-
|
|
3
|
+
# Copyright (c) 2021-2026 DISDRODB developers
|
|
4
4
|
#
|
|
5
5
|
# This program is free software: you can redistribute it and/or modify
|
|
6
6
|
# it under the terms of the GNU General Public License as published by
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -----------------------------------------------------------------------------.
|
|
3
|
-
# Copyright (c) 2021-
|
|
3
|
+
# Copyright (c) 2021-2026 DISDRODB developers
|
|
4
4
|
#
|
|
5
5
|
# This program is free software: you can redistribute it and/or modify
|
|
6
6
|
# it under the terms of the GNU General Public License as published by
|