anemoi-datasets 0.5.5__tar.gz → 0.5.7__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.
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/.github/workflows/ci.yml +3 -2
- anemoi_datasets-0.5.7/.github/workflows/push-to-private.yml +33 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/.github/workflows/python-publish.yml +1 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/.pre-commit-config.yaml +4 -4
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/CHANGELOG.md +19 -1
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/PKG-INFO +1 -1
- anemoi_datasets-0.5.7/docs/building/filters/rename.rst +20 -0
- anemoi_datasets-0.5.7/docs/building/filters/yaml/rename.yaml +11 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/netcdf.rst +2 -0
- anemoi_datasets-0.5.7/docs/building/sources/repeated_dates.rst +39 -0
- anemoi_datasets-0.5.7/docs/building/sources/xarray-based.rst +13 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/xarray-kerchunk.rst +1 -1
- anemoi_datasets-0.5.7/docs/building/sources/yaml/xarray-based.yaml +3 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/_version.py +2 -2
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/inspect.py +4 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/__init__.py +4 -39
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/__init__.py +1 -1
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/coordinates.py +8 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/flavour.py +23 -15
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/grid.py +1 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/time.py +37 -2
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/result.py +37 -1
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/persistent.py +4 -1
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/statistics/__init__.py +4 -1
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/zarr.py +5 -1
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/forwards.py +4 -1
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/join.py +13 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/select.py +11 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/stores.py +4 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/unchecked.py +5 -0
- anemoi_datasets-0.5.7/src/anemoi/datasets/testing.py +59 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi_datasets.egg-info/PKG-INFO +1 -1
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi_datasets.egg-info/SOURCES.txt +6 -1
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/create/test_create.py +7 -8
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/xarray/test_netcdf.py +12 -6
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/xarray/test_opendap.py +2 -4
- anemoi_datasets-0.5.7/tests/xarray/test_samples.py +65 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/xarray/test_zarr.py +4 -27
- anemoi_datasets-0.5.7/tools/make-sample-dataset.py +29 -0
- anemoi_datasets-0.5.5/docs/building/filters/rename.rst +0 -6
- anemoi_datasets-0.5.5/docs/building/filters/yaml/rename.yaml +0 -0
- anemoi_datasets-0.5.5/docs/building/sources/repeated_dates.rst +0 -29
- anemoi_datasets-0.5.5/tests/create/data_sources.yaml +0 -28
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/.gitattributes +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/.github/CODEOWNERS +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/.github/ci-config.yml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/.github/ci-hpc-config.yml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/.github/workflows/changelog-pr-update.yml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/.github/workflows/changelog-release-update.yml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/.github/workflows/label-public-pr.yml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/.github/workflows/python-pull-request.yml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/.github/workflows/readthedocs-pr-update.yml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/.gitignore +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/.readthedocs.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/.vscode/spellright.dict +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/LICENSE +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/README.md +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/Makefile +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/_static/logo.png +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/_static/style.css +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/_templates/.gitkeep +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/apply-fmt.sh +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/advanced-options.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/filters/empty.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/filters/noop.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/filters/rotate_winds.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/filters/select.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/filters/unrotate_winds.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/filters.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/handling-missing-dates.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/handling-missing-values.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/incremental.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/introduction.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/naming-variables.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/operations.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/accumulations.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/forcings.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/grib.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/hindcasts.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/mars.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/opendap.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/recentre.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/xarray-kerchunk.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/xarray-zarr.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/accumulations1.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/accumulations2.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/forcings.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/grib1.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/grib2.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/grib3.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/grib4.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/hindcasts.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/mars1.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/mars2.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/netcdf.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/opendap.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/recentre.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/repeated_dates1.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/repeated_dates2.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/repeated_dates3.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/repeated_dates4.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/xarray-kerchunk.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/xarray-zarr.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/zenodo.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources/zenodo.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/sources.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/statistics.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/syntax.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/yaml/Makefile +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/yaml/building1.txt +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/yaml/building1.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/yaml/building2.txt +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/yaml/building2.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/yaml/building3.txt +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/yaml/building3.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/yaml/concat.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/yaml/hindcasts.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/yaml/input.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/yaml/missing_dates.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/yaml/nan.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/building/yaml/pipe.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/check-index.sh +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/cli/compare.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/cli/copy.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/cli/create.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/cli/inspect.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/cli/introduction.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/cli/scan.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/conf.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/images.pptx +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/index.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/installing.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/overview.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/overview_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/schemas/matrix.excalidraw +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/schemas/matrix.png +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/schemas/overview.excalidraw +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/schemas/overview.png +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/schemas/recipe.excalidraw +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/schemas/recipe.png +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/area1_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/area2_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/chain_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/combine_example.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/concat1.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/cutout_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/drop_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/end_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/ensembles1_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/fill_missing_gaps_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/frequency1_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/frequency2_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/grids1_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/iterating_missing_dates1_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/iterating_missing_dates2_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/iterating_missing_dates3_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/join1.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/matching0_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/matching1_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/matching2_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/matching3_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/matching4_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/misc1.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/misc2.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/missing_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/missing_dates_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/open_cloud.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/open_combine1_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/open_combine2_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/open_complex.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/open_dict_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/open_first_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/open_list_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/open_name.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/open_other.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/open_path.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/open_yaml_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/rename_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/reorder1_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/reorder2_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/rescale_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/select1_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/select2_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/shuffle_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/some_attributes_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/start_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/statistics_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/subset_example.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/thinning_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/xy1_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/xy2_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/zip1_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/zip2_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/code/zip_xy_.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/combining.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/configuration.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/configuration.toml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/grids.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/images/area-1.png +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/images/concat.png +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/images/cutout-1.png +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/images/cutout-2.png +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/images/cutout-3.png +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/images/cutout-4.png +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/images/cutout-5.png +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/images/cutout-6.png +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/images/join.png +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/images/overlay.png +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/images/skip-missing.png +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/images/thinning-after.png +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/images/thinning-before.png +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/introduction.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/matching.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/methods.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/miscellaneous.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/missing.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/opening.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/other.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/selecting.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/statistics.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/subsetting.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/docs/using/zip.rst +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/pyproject.toml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/setup.cfg +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/__init__.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/__main__.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/__init__.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/cleanup.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/compare.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/copy.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/create.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/finalise-additions.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/finalise.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/init-additions.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/init.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/load-additions.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/load.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/patch.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/publish.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/scan.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/compute/__init__.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/compute/recentre.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/check.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/chunks.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/config.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/__init__.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/__init__.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/empty.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/noop.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/pressure_level_relative_humidity_to_specific_humidity.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/pressure_level_specific_humidity_to_relative_humidity.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/rename.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/rotate_winds.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/single_level_dewpoint_to_relative_humidity.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/single_level_relative_humidity_to_dewpoint.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/single_level_relative_humidity_to_specific_humidity.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/single_level_specific_humidity_to_relative_humidity.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/speeddir_to_uv.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/unrotate_winds.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/uv_to_speeddir.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/__init__.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/accumulations.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/constants.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/empty.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/forcings.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/grib.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/hindcasts.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/mars.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/netcdf.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/opendap.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/recentre.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/source.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/tendencies.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/field.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/fieldlist.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/metadata.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/variable.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray_kerchunk.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray_zarr.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/zenodo.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/__init__.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/action.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/concat.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/context.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/data_sources.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/empty.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/filter.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/function.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/join.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/misc.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/pipe.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/repeated_dates.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/step.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/template.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/trace.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/patch.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/size.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/statistics/summary.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/utils.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/writer.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/__init__.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/concat.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/dataset.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/debug.css +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/debug.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/ensemble.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/grids.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/indexing.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/interpolate.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/masked.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/misc.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/missing.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/rescale.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/statistics.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/subset.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/xy.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/dates/__init__.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/dates/groups.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/fields.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/grids.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/utils/__init__.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/utils/fields.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi_datasets.egg-info/dependency_links.txt +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi_datasets.egg-info/entry_points.txt +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi_datasets.egg-info/requires.txt +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi_datasets.egg-info/top_level.txt +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/create/concat.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/create/join.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/create/missing.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/create/nan.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/create/pipe.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/create/recentre.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/create/run.sh +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/create-perturbations-full.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/create-shift.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/test_chunks.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/test_data.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/test_dates.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/test_indexing.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tests/xarray/test_kerchunk.py +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tools/.gitignore +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tools/examples/Makefile +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tools/examples/an-oper-2023-2023-2p5-6h-v1.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tools/grids/Makefile +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tools/grids/grids.ipynb +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tools/grids/grids1.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tools/grids/grids2.yaml +0 -0
- {anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/tools/upload-sample-dataset.py +0 -0
|
@@ -35,8 +35,9 @@ on:
|
|
|
35
35
|
jobs:
|
|
36
36
|
# Run CI including downstream packages on self-hosted runners
|
|
37
37
|
downstream-ci:
|
|
38
|
+
|
|
38
39
|
name: downstream-ci
|
|
39
|
-
if: ${{ !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }}
|
|
40
|
+
if: ${{ !contains(github.repository, 'private') && (!github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci') }}
|
|
40
41
|
uses: ecmwf-actions/downstream-ci/.github/workflows/downstream-ci.yml@main
|
|
41
42
|
with:
|
|
42
43
|
anemoi-datasets: ecmwf/anemoi-datasets@${{ github.event.pull_request.head.sha || github.sha }}
|
|
@@ -46,7 +47,7 @@ jobs:
|
|
|
46
47
|
# Build downstream packages on HPC
|
|
47
48
|
downstream-ci-hpc:
|
|
48
49
|
name: downstream-ci-hpc
|
|
49
|
-
if: ${{ !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }}
|
|
50
|
+
if: ${{ !contains(github.repository, 'private') && (!github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci') }}
|
|
50
51
|
uses: ecmwf-actions/downstream-ci/.github/workflows/downstream-ci-hpc.yml@main
|
|
51
52
|
with:
|
|
52
53
|
anemoi-datasets: ecmwf/anemoi-datasets@${{ github.event.pull_request.head.sha || github.sha }}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: Push to private repository
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- develop
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
push_changes:
|
|
10
|
+
if: ${{ !contains(github.repository, 'private') }}
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
|
|
13
|
+
steps:
|
|
14
|
+
- name: Checkout source repository
|
|
15
|
+
uses: actions/checkout@v3
|
|
16
|
+
with:
|
|
17
|
+
fetch-depth: 0
|
|
18
|
+
fetch-tags: true
|
|
19
|
+
|
|
20
|
+
- name: Set up Git configuration
|
|
21
|
+
run: |
|
|
22
|
+
git config user.name "github-actions[bot]"
|
|
23
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
24
|
+
|
|
25
|
+
- name: Setup SSH key
|
|
26
|
+
uses: webfactory/ssh-agent@v0.5.0
|
|
27
|
+
with:
|
|
28
|
+
ssh-private-key: ${{ secrets.KEY_TO_PRIVATE }}
|
|
29
|
+
|
|
30
|
+
- name: Push changes to private repository
|
|
31
|
+
run: |
|
|
32
|
+
git remote add private git@github.com:${{ github.repository }}-private.git
|
|
33
|
+
git push --set-upstream private develop
|
|
@@ -5,12 +5,12 @@ repos:
|
|
|
5
5
|
- id: clear-notebooks-output
|
|
6
6
|
name: clear-notebooks-output
|
|
7
7
|
files: tools/.*\.ipynb$
|
|
8
|
-
stages: [commit]
|
|
8
|
+
stages: [pre-commit]
|
|
9
9
|
language: python
|
|
10
10
|
entry: jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace
|
|
11
11
|
additional_dependencies: [jupyter]
|
|
12
12
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
13
|
-
rev:
|
|
13
|
+
rev: v5.0.0
|
|
14
14
|
hooks:
|
|
15
15
|
- id: check-yaml # Check YAML files for syntax errors only
|
|
16
16
|
args: [--unsafe, --allow-multiple-documents]
|
|
@@ -40,7 +40,7 @@ repos:
|
|
|
40
40
|
- --force-single-line-imports
|
|
41
41
|
- --profile black
|
|
42
42
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
43
|
-
rev: v0.6.
|
|
43
|
+
rev: v0.6.9
|
|
44
44
|
hooks:
|
|
45
45
|
- id: ruff
|
|
46
46
|
# Next line if for documenation cod snippets
|
|
@@ -66,7 +66,7 @@ repos:
|
|
|
66
66
|
- id: docconvert
|
|
67
67
|
args: ["numpy"]
|
|
68
68
|
- repo: https://github.com/tox-dev/pyproject-fmt
|
|
69
|
-
rev: "2.2.
|
|
69
|
+
rev: "2.2.4"
|
|
70
70
|
hooks:
|
|
71
71
|
- id: pyproject-fmt
|
|
72
72
|
|
|
@@ -8,8 +8,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
8
8
|
Please add your functional changes to the appropriate section in the PR.
|
|
9
9
|
Keep it human-readable, your future self will thank you!
|
|
10
10
|
|
|
11
|
+
## [Unreleased](https://github.com/ecmwf/anemoi-datasets/compare/0.5.6...HEAD)
|
|
11
12
|
|
|
12
|
-
## [
|
|
13
|
+
## [Allow for unknown CF coordinates](https://github.com/ecmwf/anemoi-datasets/compare/0.5.5...0.5.6) - 2024-10-04
|
|
14
|
+
|
|
15
|
+
- Update documentation
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- Add `variables_metadata` entry in the dataset metadata
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- Add `variables_metadata` entry in the dataset metadata
|
|
24
|
+
|
|
25
|
+
## [0.5.5](https://github.com/ecmwf/anemoi-datasets/compare/0.5.4...0.5.5) - 2024-10-04
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
|
|
29
|
+
- Allow for unknown coordinates when parsing CF input
|
|
13
30
|
|
|
14
31
|
## [Add support for (semi-)constant fields](https://github.com/ecmwf/anemoi-datasets/compare/0.5.1...0.5.2) - 2024-10-03
|
|
15
32
|
|
|
@@ -44,6 +61,7 @@ Keep it human-readable, your future self will thank you!
|
|
|
44
61
|
- Bug fix when creating dataset from zarr
|
|
45
62
|
- Bug fix with area selection in cutout operation
|
|
46
63
|
- add paths-ignore to ci workflow
|
|
64
|
+
- call provenance less often
|
|
47
65
|
|
|
48
66
|
### Removed
|
|
49
67
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: anemoi-datasets
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.7
|
|
4
4
|
Summary: A package to hold various functions to support training of ML models on ECMWF data.
|
|
5
5
|
Author-email: "European Centre for Medium-Range Weather Forecasts (ECMWF)" <software.support@ecmwf.int>
|
|
6
6
|
License: Apache License
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
########
|
|
2
|
+
rename
|
|
3
|
+
########
|
|
4
|
+
|
|
5
|
+
When combining several sources, it is common to have different values
|
|
6
|
+
for a given attribute to represents the same concept. For example,
|
|
7
|
+
``temperature_850hPa`` and ``t_850`` are two different ways to represent
|
|
8
|
+
the temperature at 850 hPa. The ``rename`` filter allows to rename a key
|
|
9
|
+
to another key. It is a :ref:`filter <filters>` that needs to follow a
|
|
10
|
+
:ref:`source <sources>` or another filter in a :ref:`building-pipe`
|
|
11
|
+
operation.
|
|
12
|
+
|
|
13
|
+
.. literalinclude:: yaml/rename.yaml
|
|
14
|
+
:language: yaml
|
|
15
|
+
|
|
16
|
+
.. note::
|
|
17
|
+
|
|
18
|
+
The ``rename`` filter was mostly designed to rename the ``param``
|
|
19
|
+
attribute, but any key can be renamed. The ``rename`` filter can take
|
|
20
|
+
several renaming keys.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
################
|
|
2
|
+
repeated_dates
|
|
3
|
+
################
|
|
4
|
+
|
|
5
|
+
The `repeated_dates` source is used to repeat a single source multiple
|
|
6
|
+
times, so that its data is present at multiple dates. A simple example
|
|
7
|
+
of this is when you have source that contains a constant field, such as
|
|
8
|
+
orography or bathymetry, that you want to have repeated at all the dates
|
|
9
|
+
of the dataset.
|
|
10
|
+
|
|
11
|
+
The generale format of the `repeated_dates` source is:
|
|
12
|
+
|
|
13
|
+
.. literalinclude:: yaml/repeated_dates1.yaml
|
|
14
|
+
:language: yaml
|
|
15
|
+
|
|
16
|
+
where ``source`` is any of the :ref:`operations <operations>` or
|
|
17
|
+
:ref:`sources <sources>` described in the previous sections. The
|
|
18
|
+
``mode`` parameter can be one of the following:
|
|
19
|
+
|
|
20
|
+
**********
|
|
21
|
+
constant
|
|
22
|
+
**********
|
|
23
|
+
|
|
24
|
+
.. literalinclude:: yaml/repeated_dates2.yaml
|
|
25
|
+
:language: yaml
|
|
26
|
+
|
|
27
|
+
*************
|
|
28
|
+
climatology
|
|
29
|
+
*************
|
|
30
|
+
|
|
31
|
+
.. literalinclude:: yaml/repeated_dates3.yaml
|
|
32
|
+
:language: yaml
|
|
33
|
+
|
|
34
|
+
*********
|
|
35
|
+
closest
|
|
36
|
+
*********
|
|
37
|
+
|
|
38
|
+
.. literalinclude:: yaml/repeated_dates4.yaml
|
|
39
|
+
:language: yaml
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
This source uses Xarray_ internally to access the data, and assumes that
|
|
2
|
+
it follows the `CF conventions`_.
|
|
3
|
+
|
|
4
|
+
You specify any valid xarray.open_dataset_ arguments in the source.
|
|
5
|
+
|
|
6
|
+
.. literalinclude:: yaml/xarray-based.yaml
|
|
7
|
+
:language: yaml
|
|
8
|
+
|
|
9
|
+
.. _cf conventions: http://cfconventions.org/
|
|
10
|
+
|
|
11
|
+
.. _xarray: https://docs.xarray.dev/en/stable/index.html
|
|
12
|
+
|
|
13
|
+
.. _xarray.open_dataset: https://docs.xarray.dev/en/stable/generated/xarray.open_dataset.html
|
|
@@ -506,6 +506,10 @@ class Version0_6(Version):
|
|
|
506
506
|
def variables(self):
|
|
507
507
|
return self.metadata["variables"]
|
|
508
508
|
|
|
509
|
+
@property
|
|
510
|
+
def variables_metadata(self):
|
|
511
|
+
return self.metadata.get("variables_metadata", {})
|
|
512
|
+
|
|
509
513
|
|
|
510
514
|
class Version0_12(Version0_6):
|
|
511
515
|
def details(self):
|
|
@@ -25,6 +25,7 @@ from anemoi.utils.dates import frequency_to_string
|
|
|
25
25
|
from anemoi.utils.dates import frequency_to_timedelta
|
|
26
26
|
from anemoi.utils.humanize import compress_dates
|
|
27
27
|
from anemoi.utils.humanize import seconds_to_human
|
|
28
|
+
from anemoi.utils.sanitise import sanitise
|
|
28
29
|
from earthkit.data.core.order import build_remapping
|
|
29
30
|
|
|
30
31
|
from anemoi.datasets import MissingDateError
|
|
@@ -52,7 +53,7 @@ from .writer import ViewCacheArray
|
|
|
52
53
|
|
|
53
54
|
LOG = logging.getLogger(__name__)
|
|
54
55
|
|
|
55
|
-
VERSION = "0.
|
|
56
|
+
VERSION = "0.30"
|
|
56
57
|
|
|
57
58
|
|
|
58
59
|
def json_tidy(o):
|
|
@@ -325,43 +326,6 @@ def build_input_(main_config, output_config):
|
|
|
325
326
|
return builder
|
|
326
327
|
|
|
327
328
|
|
|
328
|
-
def tidy_recipe(config: object):
|
|
329
|
-
"""Remove potentially private information in the config"""
|
|
330
|
-
config = deepcopy(config)
|
|
331
|
-
if isinstance(config, (tuple, list)):
|
|
332
|
-
return [tidy_recipe(_) for _ in config]
|
|
333
|
-
if isinstance(config, (dict, DotDict)):
|
|
334
|
-
for k, v in config.items():
|
|
335
|
-
if k.startswith("_"):
|
|
336
|
-
config[k] = "*** REMOVED FOR SECURITY ***"
|
|
337
|
-
else:
|
|
338
|
-
config[k] = tidy_recipe(v)
|
|
339
|
-
if isinstance(config, str):
|
|
340
|
-
if config.startswith("_"):
|
|
341
|
-
return "*** REMOVED FOR SECURITY ***"
|
|
342
|
-
if config.startswith("s3://"):
|
|
343
|
-
return "*** REMOVED FOR SECURITY ***"
|
|
344
|
-
if config.startswith("gs://"):
|
|
345
|
-
return "*** REMOVED FOR SECURITY ***"
|
|
346
|
-
if config.startswith("http"):
|
|
347
|
-
return "*** REMOVED FOR SECURITY ***"
|
|
348
|
-
if config.startswith("ftp"):
|
|
349
|
-
return "*** REMOVED FOR SECURITY ***"
|
|
350
|
-
if config.startswith("file"):
|
|
351
|
-
return "*** REMOVED FOR SECURITY ***"
|
|
352
|
-
if config.startswith("ssh"):
|
|
353
|
-
return "*** REMOVED FOR SECURITY ***"
|
|
354
|
-
if config.startswith("scp"):
|
|
355
|
-
return "*** REMOVED FOR SECURITY ***"
|
|
356
|
-
if config.startswith("rsync"):
|
|
357
|
-
return "*** REMOVED FOR SECURITY ***"
|
|
358
|
-
if config.startswith("/"):
|
|
359
|
-
return "*** REMOVED FOR SECURITY ***"
|
|
360
|
-
if "@" in config:
|
|
361
|
-
return "*** REMOVED FOR SECURITY ***"
|
|
362
|
-
return config
|
|
363
|
-
|
|
364
|
-
|
|
365
329
|
class Init(Actor, HasRegistryMixin, HasStatisticTempMixin, HasElementForDataMixin):
|
|
366
330
|
dataset_class = NewDataset
|
|
367
331
|
def __init__(self, path, config, check_name=False, overwrite=False, use_threads=False, statistics_temp_dir=None, progress=None, test=False, cache=None, **kwargs): # fmt: skip
|
|
@@ -448,7 +412,7 @@ class Init(Actor, HasRegistryMixin, HasStatisticTempMixin, HasElementForDataMixi
|
|
|
448
412
|
metadata.update(self.main_config.get("add_metadata", {}))
|
|
449
413
|
|
|
450
414
|
metadata["_create_yaml_config"] = self.main_config.get_serialisable_dict()
|
|
451
|
-
metadata["recipe"] =
|
|
415
|
+
metadata["recipe"] = sanitise(self.main_config.get_serialisable_dict())
|
|
452
416
|
|
|
453
417
|
metadata["description"] = self.main_config.description
|
|
454
418
|
metadata["licence"] = self.main_config["licence"]
|
|
@@ -467,6 +431,7 @@ class Init(Actor, HasRegistryMixin, HasStatisticTempMixin, HasElementForDataMixi
|
|
|
467
431
|
metadata["data_request"] = self.minimal_input.data_request
|
|
468
432
|
metadata["field_shape"] = self.minimal_input.field_shape
|
|
469
433
|
metadata["proj_string"] = self.minimal_input.proj_string
|
|
434
|
+
metadata["variables_metadata"] = self.minimal_input.variables_metadata
|
|
470
435
|
|
|
471
436
|
metadata["start_date"] = dates[0].isoformat()
|
|
472
437
|
metadata["end_date"] = dates[-1].isoformat()
|
|
@@ -42,7 +42,7 @@ def load_one(emoji, context, dates, dataset, options={}, flavour=None, **kwargs)
|
|
|
42
42
|
We have seen this bug triggered when we run many clients in parallel, for example, when we create a new dataset using `xarray-zarr`.
|
|
43
43
|
"""
|
|
44
44
|
|
|
45
|
-
context.trace(emoji, dataset, options)
|
|
45
|
+
context.trace(emoji, dataset, options, kwargs)
|
|
46
46
|
|
|
47
47
|
if isinstance(dataset, str) and ".zarr" in dataset:
|
|
48
48
|
data = xr.open_zarr(name_to_zarr_store(dataset), **options)
|
|
@@ -30,6 +30,8 @@ def extract_single_value(variable):
|
|
|
30
30
|
if np.issubdtype(variable.values.dtype, np.datetime64):
|
|
31
31
|
if len(shape) == 0:
|
|
32
32
|
return to_datetime(variable.values) # Convert to python datetime
|
|
33
|
+
if shape == (1,):
|
|
34
|
+
return to_datetime(variable.values[0])
|
|
33
35
|
assert False, (shape, variable.values[:2])
|
|
34
36
|
|
|
35
37
|
if np.issubdtype(variable.values.dtype, np.timedelta64):
|
|
@@ -244,3 +246,9 @@ class ScalarCoordinate(Coordinate):
|
|
|
244
246
|
@property
|
|
245
247
|
def mars_names(self):
|
|
246
248
|
return (self.variable.name,)
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
class UnsupportedCoordinate(Coordinate):
|
|
252
|
+
@property
|
|
253
|
+
def mars_names(self):
|
|
254
|
+
return (self.variable.name,)
|
|
@@ -18,6 +18,7 @@ from .coordinates import LongitudeCoordinate
|
|
|
18
18
|
from .coordinates import ScalarCoordinate
|
|
19
19
|
from .coordinates import StepCoordinate
|
|
20
20
|
from .coordinates import TimeCoordinate
|
|
21
|
+
from .coordinates import UnsupportedCoordinate
|
|
21
22
|
from .coordinates import XCoordinate
|
|
22
23
|
from .coordinates import YCoordinate
|
|
23
24
|
from .coordinates import is_scalar
|
|
@@ -157,11 +158,13 @@ class CoordinateGuesser:
|
|
|
157
158
|
if c.shape in ((1,), tuple()):
|
|
158
159
|
return ScalarCoordinate(c)
|
|
159
160
|
|
|
160
|
-
|
|
161
|
+
LOG.warning(
|
|
161
162
|
f"Coordinate {coord} not supported\n{axis=}, {name=},"
|
|
162
163
|
f" {long_name=}, {standard_name=}, units\n\n{c}\n\n{type(c.values)} {c.shape}"
|
|
163
164
|
)
|
|
164
165
|
|
|
166
|
+
return UnsupportedCoordinate(c)
|
|
167
|
+
|
|
165
168
|
def grid(self, coordinates, variable):
|
|
166
169
|
lat = [c for c in coordinates if c.is_lat]
|
|
167
170
|
lon = [c for c in coordinates if c.is_lon]
|
|
@@ -225,20 +228,15 @@ class CoordinateGuesser:
|
|
|
225
228
|
x = x[0]
|
|
226
229
|
y = y[0]
|
|
227
230
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
if x.variable.dims != y.variable.dims:
|
|
231
|
-
raise ValueError(f"Dimensions do not match {x.name}{x.variable.dims} != {y.name}{y.variable.dims}")
|
|
232
|
-
|
|
233
|
-
if (x.name, y.name) in self._cache:
|
|
234
|
-
return self._cache[(x.name, y.name)]
|
|
231
|
+
dim_vars, unstructured = self._check_dims(variable, x, y)
|
|
235
232
|
|
|
236
|
-
if (x.name, y.name) in self._cache:
|
|
237
|
-
return self._cache[(x.name, y.name)]
|
|
238
|
-
|
|
239
|
-
assert len(x.variable.shape) == len(y.variable.shape), (x.variable.shape, y.variable.shape)
|
|
233
|
+
if (x.name, y.name, dim_vars) in self._cache:
|
|
234
|
+
return self._cache[(x.name, y.name, dim_vars)]
|
|
240
235
|
|
|
241
236
|
grid_mapping = variable.attrs.get("grid_mapping", None)
|
|
237
|
+
if grid_mapping is not None:
|
|
238
|
+
print(f"grid_mapping: {grid_mapping}")
|
|
239
|
+
print(self.ds[grid_mapping])
|
|
242
240
|
|
|
243
241
|
if grid_mapping is None:
|
|
244
242
|
LOG.warning(f"No 'grid_mapping' attribute provided for '{variable.name}'")
|
|
@@ -285,11 +283,19 @@ class CoordinateGuesser:
|
|
|
285
283
|
grid_mapping = self.ds.attrs["crs"]
|
|
286
284
|
LOG.warning(f"Using CRS {grid_mapping} from global attributes")
|
|
287
285
|
|
|
286
|
+
grid = None
|
|
288
287
|
if grid_mapping is not None:
|
|
288
|
+
|
|
289
|
+
grid_mapping = dict(self.ds[grid_mapping].attrs)
|
|
290
|
+
|
|
289
291
|
if unstructured:
|
|
290
|
-
|
|
292
|
+
grid = UnstructuredProjectionGrid(x, y, grid_mapping)
|
|
291
293
|
else:
|
|
292
|
-
|
|
294
|
+
grid = MeshProjectionGrid(x, y, grid_mapping)
|
|
295
|
+
|
|
296
|
+
if grid is not None:
|
|
297
|
+
self._cache[(x.name, y.name, dim_vars)] = grid
|
|
298
|
+
return grid
|
|
293
299
|
|
|
294
300
|
LOG.error("Could not fine a candidate for 'grid_mapping'")
|
|
295
301
|
raise NotImplementedError(f"Unstructured grid {x.name} {y.name}")
|
|
@@ -337,12 +343,14 @@ class DefaultCoordinateGuesser(CoordinateGuesser):
|
|
|
337
343
|
if standard_name == "time":
|
|
338
344
|
return TimeCoordinate(c)
|
|
339
345
|
|
|
340
|
-
|
|
346
|
+
# That is the output of `cfgrib` for forecasts
|
|
347
|
+
if name == "time" and standard_name != "forecast_reference_time":
|
|
341
348
|
return TimeCoordinate(c)
|
|
342
349
|
|
|
343
350
|
def _is_date(self, c, *, axis, name, long_name, standard_name, units):
|
|
344
351
|
if standard_name == "forecast_reference_time":
|
|
345
352
|
return DateCoordinate(c)
|
|
353
|
+
|
|
346
354
|
if name == "forecast_reference_time":
|
|
347
355
|
return DateCoordinate(c)
|
|
348
356
|
|
|
@@ -9,9 +9,12 @@
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
import datetime
|
|
12
|
+
import logging
|
|
12
13
|
|
|
13
14
|
from anemoi.utils.dates import as_datetime
|
|
14
15
|
|
|
16
|
+
LOG = logging.getLogger(__name__)
|
|
17
|
+
|
|
15
18
|
|
|
16
19
|
class Time:
|
|
17
20
|
|
|
@@ -36,7 +39,28 @@ class Time:
|
|
|
36
39
|
if len(date_coordinate) == 1 and len(time_coordinate) == 0 and len(step_coordinate) == 1:
|
|
37
40
|
return ForecastFromBaseTimeAndDate(date_coordinate[0], step_coordinate[0])
|
|
38
41
|
|
|
39
|
-
|
|
42
|
+
if len(date_coordinate) == 1 and len(time_coordinate) == 1 and len(step_coordinate) == 1:
|
|
43
|
+
return ForecastFromValidTimeAndStep(time_coordinate[0], step_coordinate[0], date_coordinate[0])
|
|
44
|
+
|
|
45
|
+
LOG.error("")
|
|
46
|
+
LOG.error(f"{len(date_coordinate)} date_coordinate")
|
|
47
|
+
for c in date_coordinate:
|
|
48
|
+
LOG.error(" %s %s %s %s", c, c.is_date, c.is_time, c.is_step)
|
|
49
|
+
# LOG.error(' %s', c.variable)
|
|
50
|
+
|
|
51
|
+
LOG.error("")
|
|
52
|
+
LOG.error(f"{len(time_coordinate)} time_coordinate")
|
|
53
|
+
for c in time_coordinate:
|
|
54
|
+
LOG.error(" %s %s %s %s", c, c.is_date, c.is_time, c.is_step)
|
|
55
|
+
# LOG.error(' %s', c.variable)
|
|
56
|
+
|
|
57
|
+
LOG.error("")
|
|
58
|
+
LOG.error(f"{len(step_coordinate)} step_coordinate")
|
|
59
|
+
for c in step_coordinate:
|
|
60
|
+
LOG.error(" %s %s %s %s", c, c.is_date, c.is_time, c.is_step)
|
|
61
|
+
# LOG.error(' %s', c.variable)
|
|
62
|
+
|
|
63
|
+
raise NotImplementedError(f"{len(date_coordinate)=} {len(time_coordinate)=} {len(step_coordinate)=}")
|
|
40
64
|
|
|
41
65
|
|
|
42
66
|
class Constant(Time):
|
|
@@ -62,9 +86,10 @@ class Analysis(Time):
|
|
|
62
86
|
|
|
63
87
|
class ForecastFromValidTimeAndStep(Time):
|
|
64
88
|
|
|
65
|
-
def __init__(self, time_coordinate, step_coordinate):
|
|
89
|
+
def __init__(self, time_coordinate, step_coordinate, date_coordinate=None):
|
|
66
90
|
self.time_coordinate_name = time_coordinate.variable.name
|
|
67
91
|
self.step_coordinate_name = step_coordinate.variable.name
|
|
92
|
+
self.date_coordinate_name = date_coordinate.variable.name if date_coordinate else None
|
|
68
93
|
|
|
69
94
|
def fill_time_metadata(self, coords_values, metadata):
|
|
70
95
|
valid_datetime = coords_values[self.time_coordinate_name]
|
|
@@ -79,6 +104,16 @@ class ForecastFromValidTimeAndStep(Time):
|
|
|
79
104
|
metadata["date"] = as_datetime(base_datetime).strftime("%Y%m%d")
|
|
80
105
|
metadata["time"] = as_datetime(base_datetime).strftime("%H%M")
|
|
81
106
|
metadata["step"] = int(hours)
|
|
107
|
+
|
|
108
|
+
# When date is present, it should be compatible with time and step
|
|
109
|
+
|
|
110
|
+
if self.date_coordinate_name is not None:
|
|
111
|
+
# Not sure that this is the correct assumption
|
|
112
|
+
assert coords_values[self.date_coordinate_name] == base_datetime, (
|
|
113
|
+
coords_values[self.date_coordinate_name],
|
|
114
|
+
base_datetime,
|
|
115
|
+
)
|
|
116
|
+
|
|
82
117
|
return valid_datetime
|
|
83
118
|
|
|
84
119
|
|
|
@@ -30,6 +30,31 @@ from .trace import trace_datasource
|
|
|
30
30
|
LOG = logging.getLogger(__name__)
|
|
31
31
|
|
|
32
32
|
|
|
33
|
+
def _fields_metatata(variables, cube):
|
|
34
|
+
assert isinstance(variables, tuple), variables
|
|
35
|
+
|
|
36
|
+
result = {}
|
|
37
|
+
for i, c in enumerate(cube.iterate_cubelets()):
|
|
38
|
+
assert c._coords_names[1] == variables[i], (c._coords_names[1], variables[i])
|
|
39
|
+
f = cube[c.coords]
|
|
40
|
+
md = f.metadata(namespace="mars")
|
|
41
|
+
if not md:
|
|
42
|
+
md = f.metadata(namespace="default")
|
|
43
|
+
|
|
44
|
+
if md.get("param") == "~":
|
|
45
|
+
md["param"] = f.metadata("param")
|
|
46
|
+
assert md["param"] not in ("~", "unknown"), (md, f.metadata("param"))
|
|
47
|
+
|
|
48
|
+
if md.get("param") == "unknown":
|
|
49
|
+
md["param"] = str(f.metadata("paramId", default="unknown"))
|
|
50
|
+
# assert md['param'] != 'unknown', (md, f.metadata('param'))
|
|
51
|
+
|
|
52
|
+
result[variables[i]] = md
|
|
53
|
+
|
|
54
|
+
assert i + 1 == len(variables), (i + 1, len(variables))
|
|
55
|
+
return result
|
|
56
|
+
|
|
57
|
+
|
|
33
58
|
def _data_request(data):
|
|
34
59
|
date = None
|
|
35
60
|
params_levels = defaultdict(set)
|
|
@@ -312,7 +337,10 @@ class Result:
|
|
|
312
337
|
def build_coords(self):
|
|
313
338
|
if self._coords_already_built:
|
|
314
339
|
return
|
|
315
|
-
|
|
340
|
+
|
|
341
|
+
cube = self.get_cube()
|
|
342
|
+
|
|
343
|
+
from_data = cube.user_coords
|
|
316
344
|
from_config = self.context.order_by
|
|
317
345
|
|
|
318
346
|
keys_from_config = list(from_config.keys())
|
|
@@ -359,11 +387,19 @@ class Result:
|
|
|
359
387
|
self._field_shape = first_field.shape
|
|
360
388
|
self._proj_string = first_field.proj_string if hasattr(first_field, "proj_string") else None
|
|
361
389
|
|
|
390
|
+
self._cube = cube
|
|
391
|
+
|
|
392
|
+
self._coords_already_built = True
|
|
393
|
+
|
|
362
394
|
@property
|
|
363
395
|
def variables(self):
|
|
364
396
|
self.build_coords()
|
|
365
397
|
return self._variables
|
|
366
398
|
|
|
399
|
+
@property
|
|
400
|
+
def variables_metadata(self):
|
|
401
|
+
return _fields_metatata(self.variables, self._cube)
|
|
402
|
+
|
|
367
403
|
@property
|
|
368
404
|
def ensembles(self):
|
|
369
405
|
self.build_coords()
|
|
@@ -56,8 +56,11 @@ class PersistentDict:
|
|
|
56
56
|
yield pickle.load(f)
|
|
57
57
|
|
|
58
58
|
def add_provenance(self, **kwargs):
|
|
59
|
+
path = os.path.join(self.dirname, "provenance.json")
|
|
60
|
+
if os.path.exists(path):
|
|
61
|
+
return
|
|
59
62
|
out = dict(provenance=gather_provenance_info(), **kwargs)
|
|
60
|
-
with open(
|
|
63
|
+
with open(path, "w") as f:
|
|
61
64
|
json.dump(out, f)
|
|
62
65
|
|
|
63
66
|
def add(self, elt, *, key):
|
{anemoi_datasets-0.5.5 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/statistics/__init__.py
RENAMED
|
@@ -187,8 +187,11 @@ class TmpStatistics:
|
|
|
187
187
|
|
|
188
188
|
def add_provenance(self, **kwargs):
|
|
189
189
|
self.create(exist_ok=True)
|
|
190
|
+
path = os.path.join(self.dirname, "provenance.json")
|
|
191
|
+
if os.path.exists(path):
|
|
192
|
+
return
|
|
190
193
|
out = dict(provenance=gather_provenance_info(), **kwargs)
|
|
191
|
-
with open(
|
|
194
|
+
with open(path, "w") as f:
|
|
192
195
|
json.dump(out, f)
|
|
193
196
|
|
|
194
197
|
def create(self, exist_ok):
|
|
@@ -168,7 +168,11 @@ class ZarrBuiltRegistry:
|
|
|
168
168
|
return self.create(lengths, overwrite=True)
|
|
169
169
|
|
|
170
170
|
def add_provenance(self, name):
|
|
171
|
+
z = self._open_write()
|
|
172
|
+
|
|
173
|
+
if name in z.attrs:
|
|
174
|
+
return
|
|
175
|
+
|
|
171
176
|
from anemoi.utils.provenance import gather_provenance_info
|
|
172
177
|
|
|
173
|
-
z = self._open_write()
|
|
174
178
|
z.attrs[name] = gather_provenance_info()
|