anemoi-datasets 0.5.24__tar.gz → 0.5.25__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (399) hide show
  1. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.pre-commit-config.yaml +2 -2
  2. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.release-please-config.json +6 -1
  3. anemoi_datasets-0.5.25/.release-please-manifest.json +3 -0
  4. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/CHANGELOG.md +14 -0
  5. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/PKG-INFO +1 -1
  6. anemoi_datasets-0.5.25/docs/adr/adr-1.md +63 -0
  7. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/_version.py +2 -2
  8. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/finalise-additions.py +2 -1
  9. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/finalise.py +2 -1
  10. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/init-additions.py +2 -1
  11. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/load-additions.py +2 -1
  12. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/load.py +2 -1
  13. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/__init__.py +24 -33
  14. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/input/__init__.py +0 -20
  15. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/accumulations.py +7 -6
  16. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/dataset.py +29 -0
  17. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/misc.py +74 -16
  18. anemoi_datasets-0.5.25/src/anemoi/datasets/data/observations/__init__.py +316 -0
  19. anemoi_datasets-0.5.25/src/anemoi/datasets/data/observations/legacy_obs_dataset.py +200 -0
  20. anemoi_datasets-0.5.25/src/anemoi/datasets/data/observations/multi.py +64 -0
  21. anemoi_datasets-0.5.25/src/anemoi/datasets/data/padded.py +227 -0
  22. anemoi_datasets-0.5.25/src/anemoi/datasets/data/records/__init__.py +442 -0
  23. anemoi_datasets-0.5.25/src/anemoi/datasets/data/records/backends/__init__.py +157 -0
  24. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/subset.py +5 -0
  25. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi_datasets.egg-info/PKG-INFO +1 -1
  26. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi_datasets.egg-info/SOURCES.txt +10 -0
  27. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/test_data.py +25 -1
  28. anemoi_datasets-0.5.25/tests/test_records.py +160 -0
  29. anemoi_datasets-0.5.25/tools/build-obs.py +52 -0
  30. anemoi_datasets-0.5.25/tools/check-obs.py +60 -0
  31. anemoi_datasets-0.5.24/.release-please-manifest.json +0 -3
  32. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.gitattributes +0 -0
  33. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.github/CODEOWNERS +0 -0
  34. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  35. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.github/ci-hpc-config.yml +0 -0
  36. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.github/dependabot.yml +0 -0
  37. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.github/labeler.yml +0 -0
  38. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.github/pull_request_template.md +0 -0
  39. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.github/workflows/downstream-ci-hpc.yml +0 -0
  40. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.github/workflows/pr-conventional-commit.yml +0 -0
  41. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.github/workflows/pr-label-conventional-commits.yml +0 -0
  42. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.github/workflows/pr-label-file-based.yml +0 -0
  43. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.github/workflows/pr-label-public.yml +0 -0
  44. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.github/workflows/push-to-private.yml +0 -0
  45. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.github/workflows/python-publish.yml +0 -0
  46. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.github/workflows/python-pull-request.yml +0 -0
  47. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.github/workflows/readthedocs-pr-update.yml +0 -0
  48. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.github/workflows/release-please.yml +0 -0
  49. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.gitignore +0 -0
  50. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.readthedocs.yaml +0 -0
  51. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/.vscode/spellright.dict +0 -0
  52. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/03-constant-fields.rst +0 -0
  53. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/CONTRIBUTORS.md +0 -0
  54. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/LICENSE +0 -0
  55. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/README.md +0 -0
  56. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/Makefile +0 -0
  57. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/2t_map_example.png +0 -0
  58. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/area-1.png +0 -0
  59. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/concat.png +0 -0
  60. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/cutout-1.png +0 -0
  61. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/cutout-2.png +0 -0
  62. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/cutout-3.png +0 -0
  63. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/cutout-4.png +0 -0
  64. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/cutout-5.png +0 -0
  65. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/cutout-6.png +0 -0
  66. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/join.png +0 -0
  67. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/logo.png +0 -0
  68. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/overlay.png +0 -0
  69. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/schemas/matrix.excalidraw +0 -0
  70. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/schemas/matrix.png +0 -0
  71. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/schemas/overview.excalidraw +0 -0
  72. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/schemas/overview.png +0 -0
  73. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/schemas/recipe.excalidraw +0 -0
  74. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/schemas/recipe.png +0 -0
  75. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/skip-missing.png +0 -0
  76. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/style.css +0 -0
  77. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/thinning-after.png +0 -0
  78. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_static/thinning-before.png +0 -0
  79. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_templates/.gitkeep +0 -0
  80. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/_templates/apidoc/package.rst.jinja +0 -0
  81. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/apply-fmt.sh +0 -0
  82. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/check-index.sh +0 -0
  83. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/cli/compare-lam.rst +0 -0
  84. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/cli/compare.rst +0 -0
  85. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/cli/copy.rst +0 -0
  86. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/cli/create.rst +0 -0
  87. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/cli/grib-index.rst +0 -0
  88. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/cli/inspect.rst +0 -0
  89. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/cli/introduction.rst +0 -0
  90. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/cli/patch.rst +0 -0
  91. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/cli/scan.rst +0 -0
  92. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/conf.py +0 -0
  93. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/advanced-options.rst +0 -0
  94. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/filters/empty.rst +0 -0
  95. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/filters/noop.rst +0 -0
  96. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/filters/orog_to_z.rst +0 -0
  97. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/filters/regrid.rst +0 -0
  98. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/filters/rename.rst +0 -0
  99. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/filters/rotate_winds.rst +0 -0
  100. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/filters/select.rst +0 -0
  101. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/filters/sum.rst +0 -0
  102. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/filters/unrotate_winds.rst +0 -0
  103. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/filters/wz_to_w.rst +0 -0
  104. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/filters/yaml/orog_to_z.yaml +0 -0
  105. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/filters/yaml/regrid1.yaml +0 -0
  106. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/filters/yaml/regrid2.yaml +0 -0
  107. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/filters/yaml/rename.yaml +0 -0
  108. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/filters/yaml/sum.yaml +0 -0
  109. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/filters/yaml/wz_to_w.yaml +0 -0
  110. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/filters.rst +0 -0
  111. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/handling-missing-dates.rst +0 -0
  112. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/handling-missing-values.rst +0 -0
  113. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/incremental.rst +0 -0
  114. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/introduction.rst +0 -0
  115. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/naming-conventions.rst +0 -0
  116. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/naming-variables.rst +0 -0
  117. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/operations.rst +0 -0
  118. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/accumulations.rst +0 -0
  119. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/anemoi-dataset.rst +0 -0
  120. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/cds.rst +0 -0
  121. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/eccc-fstd.rst +0 -0
  122. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/forcings.rst +0 -0
  123. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/grib-index.rst +0 -0
  124. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/grib.rst +0 -0
  125. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/hindcasts.rst +0 -0
  126. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/mars.rst +0 -0
  127. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/netcdf.rst +0 -0
  128. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/opendap.rst +0 -0
  129. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/recentre.rst +0 -0
  130. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/repeated-dates.rst +0 -0
  131. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/xarray-based.rst +0 -0
  132. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/xarray-kerchunk.py +0 -0
  133. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/xarray-kerchunk.rst +0 -0
  134. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/xarray-zarr.rst +0 -0
  135. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/accumulations1.yaml +0 -0
  136. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/accumulations2.yaml +0 -0
  137. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/anemoi-dataset.yaml +0 -0
  138. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/eccc-fstd.yaml +0 -0
  139. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/forcings.yaml +0 -0
  140. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/grib1.yaml +0 -0
  141. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/grib2.yaml +0 -0
  142. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/grib3.yaml +0 -0
  143. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/grib4.yaml +0 -0
  144. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/hindcasts.yaml +0 -0
  145. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/mars-cds.yaml +0 -0
  146. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/mars1.yaml +0 -0
  147. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/mars2.yaml +0 -0
  148. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/netcdf.yaml +0 -0
  149. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/opendap.yaml +0 -0
  150. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/recentre.yaml +0 -0
  151. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/repeated-dates1.yaml +0 -0
  152. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/repeated-dates2.yaml +0 -0
  153. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/repeated-dates3.yaml +0 -0
  154. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/repeated-dates4.yaml +0 -0
  155. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/xarray-based.yaml +0 -0
  156. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/xarray-kerchunk.yaml +0 -0
  157. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/xarray-zarr.yaml +0 -0
  158. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/yaml/zenodo.yaml +0 -0
  159. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources/zenodo.rst +0 -0
  160. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/sources.rst +0 -0
  161. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/statistics.rst +0 -0
  162. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/building/syntax.yaml +0 -0
  163. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/introduction.rst +0 -0
  164. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/using/combining.rst +0 -0
  165. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/using/configuration.rst +0 -0
  166. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/using/configuration.toml +0 -0
  167. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/using/ensembles.rst +0 -0
  168. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/using/grids.rst +0 -0
  169. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/using/introduction.rst +0 -0
  170. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/using/matching.rst +0 -0
  171. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/using/methods.rst +0 -0
  172. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/using/miscellaneous.rst +0 -0
  173. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/using/missing.rst +0 -0
  174. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/using/opening.rst +0 -0
  175. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/using/other.rst +0 -0
  176. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/using/selecting.rst +0 -0
  177. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/using/statistics.rst +0 -0
  178. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/using/subsetting.rst +0 -0
  179. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/using/zip.rst +0 -0
  180. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/yaml/Makefile +0 -0
  181. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/yaml/building1.txt +0 -0
  182. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/yaml/building1.yaml +0 -0
  183. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/yaml/building2.txt +0 -0
  184. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/yaml/building2.yaml +0 -0
  185. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/yaml/building3.txt +0 -0
  186. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/yaml/building3.yaml +0 -0
  187. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/yaml/concat.yaml +0 -0
  188. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/yaml/hindcasts.yaml +0 -0
  189. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/yaml/input.yaml +0 -0
  190. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/yaml/missing_dates.yaml +0 -0
  191. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/yaml/nan.yaml +0 -0
  192. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/datasets/yaml/pipe.yaml +0 -0
  193. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/dev/contributing.rst +0 -0
  194. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/01-grib-data.rst +0 -0
  195. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/02-cf-data.rst +0 -0
  196. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/03-constant-fields.rst +0 -0
  197. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/yaml/grib-flavour1.yaml +0 -0
  198. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/yaml/grib-flavour2.yaml +0 -0
  199. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/yaml/grib-flavour3.yaml +0 -0
  200. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/yaml/grib-flavour4.yaml +0 -0
  201. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/yaml/grib-recipe1.yaml +0 -0
  202. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/yaml/grib-recipe2.yaml +0 -0
  203. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/yaml/grib-recipe3.yaml +0 -0
  204. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/yaml/grib-recipe4.yaml +0 -0
  205. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/yaml/grib-recipe5.yaml +0 -0
  206. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/yaml/netcdf1.yaml +0 -0
  207. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/yaml/opendap1.yaml +0 -0
  208. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/yaml/xarray-flavour1.yaml +0 -0
  209. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/yaml/xarray-patch1.yaml +0 -0
  210. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/yaml/xarray-patch2.yaml +0 -0
  211. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/create/yaml/zarr1.yaml +0 -0
  212. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/introduction.rst +0 -0
  213. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/usage/01-interpolate-step-dataset-combination.rst +0 -0
  214. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/usage/02-coutout-complement-combination.rst +0 -0
  215. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/usage/code/cutout-complement1.py +0 -0
  216. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/usage/code/interpolate1.py +0 -0
  217. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/usage/code/interpolate2.py +0 -0
  218. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/usage/yaml/cutout-complement1.yaml +0 -0
  219. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/usage/yaml/interpolate1.yaml +0 -0
  220. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/howtos/usage/yaml/interpolate2.yaml +0 -0
  221. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/index.rst +0 -0
  222. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/installing.rst +0 -0
  223. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/modules/dataset.rst +0 -0
  224. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/modules/filters.rst +0 -0
  225. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/modules/sources.rst +0 -0
  226. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/overview.rst +0 -0
  227. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/pptx/images.pptx +0 -0
  228. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/scripts/api_build.sh +0 -0
  229. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/usage/getting_started.rst +0 -0
  230. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/usage/yaml/aifs-ea-an-oper-0001-mars-o48-2020-2021-6h-v1.yaml +0 -0
  231. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/docs/using/code/trimedge1_.py +0 -0
  232. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/pyproject.toml +0 -0
  233. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/setup.cfg +0 -0
  234. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/__init__.py +0 -0
  235. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/__main__.py +0 -0
  236. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/check.py +0 -0
  237. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/__init__.py +0 -0
  238. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/check.py +0 -0
  239. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/cleanup.py +0 -0
  240. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/compare-lam.py +0 -0
  241. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/compare.py +0 -0
  242. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/copy.py +0 -0
  243. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/create.py +0 -0
  244. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/grib-index.py +0 -0
  245. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/init.py +0 -0
  246. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/inspect.py +0 -0
  247. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/patch.py +0 -0
  248. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/publish.py +0 -0
  249. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/commands/scan.py +0 -0
  250. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/compute/__init__.py +0 -0
  251. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/compute/recentre.py +0 -0
  252. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/check.py +0 -0
  253. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/chunks.py +0 -0
  254. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/config.py +0 -0
  255. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filter.py +0 -0
  256. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/__init__.py +0 -0
  257. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/empty.py +0 -0
  258. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/legacy.py +0 -0
  259. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/noop.py +0 -0
  260. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/orog_to_z.py +0 -0
  261. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/pressure_level_relative_humidity_to_specific_humidity.py +0 -0
  262. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/pressure_level_specific_humidity_to_relative_humidity.py +0 -0
  263. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/rename.py +0 -0
  264. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/rotate_winds.py +0 -0
  265. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/single_level_dewpoint_to_relative_humidity.py +0 -0
  266. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/single_level_relative_humidity_to_dewpoint.py +0 -0
  267. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/single_level_relative_humidity_to_specific_humidity.py +0 -0
  268. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/single_level_specific_humidity_to_relative_humidity.py +0 -0
  269. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/speeddir_to_uv.py +0 -0
  270. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/sum.py +0 -0
  271. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/transform.py +0 -0
  272. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/unrotate_winds.py +0 -0
  273. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/uv_to_speeddir.py +0 -0
  274. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/filters/wz_to_w.py +0 -0
  275. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/input/action.py +0 -0
  276. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/input/concat.py +0 -0
  277. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/input/context.py +0 -0
  278. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/input/data_sources.py +0 -0
  279. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/input/empty.py +0 -0
  280. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/input/filter.py +0 -0
  281. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/input/function.py +0 -0
  282. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/input/join.py +0 -0
  283. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/input/misc.py +0 -0
  284. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/input/pipe.py +0 -0
  285. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/input/repeated_dates.py +0 -0
  286. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/input/result.py +0 -0
  287. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/input/step.py +0 -0
  288. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/input/template.py +0 -0
  289. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/input/trace.py +0 -0
  290. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/patch.py +0 -0
  291. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/persistent.py +0 -0
  292. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/size.py +0 -0
  293. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/source.py +0 -0
  294. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/__init__.py +0 -0
  295. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/accumulations2.py +0 -0
  296. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/anemoi_dataset.py +0 -0
  297. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/constants.py +0 -0
  298. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/eccc_fstd.py +0 -0
  299. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/empty.py +0 -0
  300. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/forcings.py +0 -0
  301. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/grib.py +0 -0
  302. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/grib_index.py +0 -0
  303. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/hindcasts.py +0 -0
  304. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/legacy.py +0 -0
  305. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/mars.py +0 -0
  306. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/netcdf.py +0 -0
  307. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/opendap.py +0 -0
  308. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/patterns.py +0 -0
  309. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/recentre.py +0 -0
  310. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/source.py +0 -0
  311. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/tendencies.py +0 -0
  312. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/xarray.py +0 -0
  313. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/xarray_kerchunk.py +0 -0
  314. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/xarray_support/README.md +0 -0
  315. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/xarray_support/__init__.py +0 -0
  316. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/xarray_support/coordinates.py +0 -0
  317. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/xarray_support/field.py +0 -0
  318. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/xarray_support/fieldlist.py +0 -0
  319. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/xarray_support/flavour.py +0 -0
  320. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/xarray_support/grid.py +0 -0
  321. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/xarray_support/metadata.py +0 -0
  322. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/xarray_support/patch.py +0 -0
  323. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/xarray_support/time.py +0 -0
  324. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/xarray_support/variable.py +0 -0
  325. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/xarray_zarr.py +0 -0
  326. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/sources/zenodo.py +0 -0
  327. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/statistics/__init__.py +0 -0
  328. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/statistics/summary.py +0 -0
  329. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/testing.py +0 -0
  330. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/typing.py +0 -0
  331. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/utils.py +0 -0
  332. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/writer.py +0 -0
  333. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/create/zarr.py +0 -0
  334. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/__init__.py +0 -0
  335. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/complement.py +0 -0
  336. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/concat.py +0 -0
  337. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/debug.css +0 -0
  338. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/debug.py +0 -0
  339. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/ensemble.py +0 -0
  340. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/fill_missing.py +0 -0
  341. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/forwards.py +0 -0
  342. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/grids.py +0 -0
  343. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/indexing.py +0 -0
  344. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/interpolate.py +0 -0
  345. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/join.py +0 -0
  346. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/masked.py +0 -0
  347. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/merge.py +0 -0
  348. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/missing.py +0 -0
  349. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/rescale.py +0 -0
  350. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/select.py +0 -0
  351. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/statistics.py +0 -0
  352. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/stores.py +0 -0
  353. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/unchecked.py +0 -0
  354. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/data/xy.py +0 -0
  355. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/dates/__init__.py +0 -0
  356. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/dates/groups.py +0 -0
  357. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/grids.py +0 -0
  358. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/testing.py +0 -0
  359. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi/datasets/utils/__init__.py +0 -0
  360. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi_datasets.egg-info/dependency_links.txt +0 -0
  361. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi_datasets.egg-info/entry_points.txt +0 -0
  362. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi_datasets.egg-info/requires.txt +0 -0
  363. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/src/anemoi_datasets.egg-info/top_level.txt +0 -0
  364. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/create/accumulation.yaml +0 -0
  365. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/create/concat.yaml +0 -0
  366. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/create/join.yaml +0 -0
  367. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/create/missing.yaml +0 -0
  368. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/create/nan.yaml +0 -0
  369. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/create/pipe.yaml +0 -0
  370. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/create/recentre.yaml +0 -0
  371. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/create/regrid.yaml +0 -0
  372. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/create/run.sh +0 -0
  373. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/create/test_create.py +0 -0
  374. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/create/test_sources.py +0 -0
  375. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/create-perturbations-full.yaml +0 -0
  376. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/create-shift.yaml +0 -0
  377. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/test_chunks.py +0 -0
  378. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/test_data_gridded.py +0 -0
  379. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/test_dates.py +0 -0
  380. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/test_indexing.py +0 -0
  381. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/xarray/test_netcdf.py +0 -0
  382. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/xarray/test_opendap.py +0 -0
  383. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/xarray/test_samples.py +0 -0
  384. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tests/xarray/test_zarr.py +0 -0
  385. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tools/.gitignore +0 -0
  386. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tools/examples/Makefile +0 -0
  387. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tools/examples/an-oper-2023-2023-2p5-6h-v1.yaml +0 -0
  388. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tools/grids/Makefile +0 -0
  389. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tools/grids/grids.ipynb +0 -0
  390. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tools/grids/grids1.yaml +0 -0
  391. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tools/grids/grids2.yaml +0 -0
  392. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tools/grids/grids3.yaml +0 -0
  393. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tools/grids/grids4.yaml +0 -0
  394. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tools/grids/grids5.yaml +0 -0
  395. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tools/grids/grids6.yaml +0 -0
  396. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tools/grids/grids7.yaml +0 -0
  397. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tools/grids/grids_multilam.ipynb +0 -0
  398. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tools/make-sample-dataset.py +0 -0
  399. {anemoi_datasets-0.5.24 → anemoi_datasets-0.5.25}/tools/upload-sample-dataset.py +0 -0
@@ -41,7 +41,7 @@ repos:
41
41
  - --profile black
42
42
  - --project anemoi
43
43
  - repo: https://github.com/astral-sh/ruff-pre-commit
44
- rev: v0.11.4
44
+ rev: v0.11.12
45
45
  hooks:
46
46
  - id: ruff
47
47
  args:
@@ -65,7 +65,7 @@ repos:
65
65
  - id: docconvert
66
66
  args: ["numpy"]
67
67
  - repo: https://github.com/tox-dev/pyproject-fmt
68
- rev: "v2.5.1"
68
+ rev: "v2.6.0"
69
69
  hooks:
70
70
  - id: pyproject-fmt
71
71
  - repo: https://github.com/jshwi/docsig # Check docstrings against function sig
@@ -10,11 +10,16 @@
10
10
  "draft-pull-request": true,
11
11
  "pull-request-title-pattern": "chore${scope}: Release${component} ${version}",
12
12
  "pull-request-header": ":robot: Automated Release PR\n\nThis PR was created by `release-please` to prepare the next release. Once merged:\n\n1. A new version tag will be created\n2. A GitHub release will be published\n3. The changelog will be updated\n\nChanges to be included in the next release:",
13
- "pull-request-footer": "> [!IMPORTANT]\n> :warning: Merging this PR will:\n> - Create a new release\n> - Trigger deployment pipelines\n> - Update package versions\n\n **Before merging:**\n - Ensure all tests pass\n - Review the changelog carefully\n - Get required approvals\n\n [Release-please documentation](https://github.com/googleapis/release-please)",
13
+ "pull-request-footer": "> [!IMPORTANT]\n> Please do not change the PR title, manifest file, or any other automatically generated content in this PR unless you understand the implications. Changes here can break the release process.\n> :warning: Merging this PR will:\n> - Create a new release\n> - Trigger deployment pipelines\n> - Update package versions\n\n **Before merging:**\n - Ensure all tests pass\n - Review the changelog carefully\n - Get required approvals\n\n [Release-please documentation](https://github.com/googleapis/release-please)",
14
14
  "packages": {
15
15
  ".": {
16
16
  "package-name": "anemoi-datasets"
17
17
  }
18
18
  },
19
+ "plugins": [
20
+ {
21
+ "type": "sentence-case"
22
+ }
23
+ ],
19
24
  "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json"
20
25
  }
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.5.25"
3
+ }
@@ -8,6 +8,20 @@ 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
+ ## [0.5.25](https://github.com/ecmwf/anemoi-datasets/compare/0.5.24...0.5.25) (2025-06-11)
12
+
13
+
14
+ ### Features
15
+
16
+ * Integrating non-regular datasets in anemoi for observations. ([#306](https://github.com/ecmwf/anemoi-datasets/issues/306)) ([95a0fe4](https://github.com/ecmwf/anemoi-datasets/commit/95a0fe4bb10dc48469c0be0efad94f4d5e2a9fe8))
17
+
18
+
19
+ ### Bug Fixes
20
+
21
+ * Incremental dataset build tasks called regardless of presence of debug flag in CLI code ([#294](https://github.com/ecmwf/anemoi-datasets/issues/294)) ([37afc0d](https://github.com/ecmwf/anemoi-datasets/commit/37afc0d6489f2d6c4b3ce3f9901c40e4cec5c4eb))
22
+ * Regression in accumulations [#354](https://github.com/ecmwf/anemoi-datasets/issues/354) ([#355](https://github.com/ecmwf/anemoi-datasets/issues/355)) ([f9769d7](https://github.com/ecmwf/anemoi-datasets/commit/f9769d7944738ecbedb6b3cc1f78cd26de36a73f))
23
+ * Remove 2 layers of build function ([#348](https://github.com/ecmwf/anemoi-datasets/issues/348)) ([7a904c4](https://github.com/ecmwf/anemoi-datasets/commit/7a904c451772089f120419a9d39bff746e0aeebb))
24
+
11
25
  ## [0.5.24](https://github.com/ecmwf/anemoi-datasets/compare/0.5.23...0.5.24) (2025-05-23)
12
26
 
13
27
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: anemoi-datasets
3
- Version: 0.5.24
3
+ Version: 0.5.25
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,63 @@
1
+ # Support irregular observations datasets
2
+
3
+ ## Status
4
+
5
+ <!--What is the status? -->
6
+
7
+ Proposed - 30/04/2025
8
+
9
+ ## Context
10
+
11
+ <!--What is the issue that we are seeing that is motivating this decision or change?-->
12
+
13
+ The objective of this change is to support observations data which is not regular.
14
+
15
+ In contrast with the fields data where each date contain the same number of points,
16
+ in the observations data, the number of points can change for every time window.
17
+
18
+ The Zarr format fits well the fields data, but does not fit the observations data.
19
+
20
+ To allow storing data with irregular shape, we need to use another format than the zarr used for fields.
21
+ An experimental implementation using xarray-zarr has been developed and is not optimised for ML training.
22
+
23
+ ## Decision
24
+
25
+ <!--Describe the change that you are proposing.-->
26
+
27
+ Add a functionality in anemoi-datasets to read observations datasets and provide the data as dictionary/mapper of numpy arrays.
28
+
29
+ Mimic as much as possible what is done for field datasets :
30
+
31
+ `ds = open_dataset(....)`
32
+ `ds[i]` -> provides the data for a given time window, related to a given reference date. As a dictionary-like object.
33
+ `ds.dates` -> list of reference date, `ds.dates[i]` is the reference date for the data provided in `ds[i]`
34
+
35
+ Also expose the latitudes, longitudes in a sensible way (as `ds.latitudes` and `ds.longitudes` now depend on the dates) and name_to_index and statistics and metadata, etc.
36
+
37
+ These API choices need to be made on an actual training use case.
38
+
39
+ Step to achieve this:
40
+ - Implement now a prototype format to allow developing ML training code on observation data.
41
+ - Performing extensive benchmarking with various formats (explore parquet, and other).
42
+ - As the final format is not defined yet, ensure a flexible architecture to allow switching (this will help for benchmarking).
43
+
44
+
45
+ ## Scope of Change
46
+
47
+ <!--Specify which Anemoi packages/modules will be affected by this decision.-->
48
+ - anemoi-datasets
49
+ Not a breaking change, this only add functionality to read observations datasets.
50
+
51
+ Must be in line with the change related to multi-datasets.
52
+
53
+ ## Consequences
54
+
55
+ <!--Discuss the impact of this decision, including benefits, trade-offs, and potential technical debt.-->
56
+
57
+ ## Alternatives Considered [Optional]
58
+
59
+ <!--List alternative solutions and why they were not chosen.-->
60
+
61
+ ## References [Optional]
62
+
63
+ <!--Links to relevant discussions, documentation, or external resources.-->
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.5.24'
21
- __version_tuple__ = version_tuple = (0, 5, 24)
20
+ __version__ = version = '0.5.25'
21
+ __version_tuple__ = version_tuple = (0, 5, 25)
@@ -61,7 +61,8 @@ class FinaliseAdditions(Command):
61
61
 
62
62
  if "debug" in options:
63
63
  options.pop("debug")
64
- task(step, options)
64
+
65
+ task(step, options)
65
66
 
66
67
  LOG.info(f"Create step '{step}' completed in {seconds_to_human(time.time()-now)}")
67
68
 
@@ -55,7 +55,8 @@ class Finalise(Command):
55
55
 
56
56
  if "debug" in options:
57
57
  options.pop("debug")
58
- task(step, options)
58
+
59
+ task(step, options)
59
60
 
60
61
  LOG.info(f"Create step '{step}' completed in {seconds_to_human(time.time()-now)}")
61
62
 
@@ -61,7 +61,8 @@ class InitAdditions(Command):
61
61
 
62
62
  if "debug" in options:
63
63
  options.pop("debug")
64
- task(step, options)
64
+
65
+ task(step, options)
65
66
 
66
67
  LOG.info(f"Create step '{step}' completed in {seconds_to_human(time.time()-now)}")
67
68
 
@@ -62,7 +62,8 @@ class LoadAdditions(Command):
62
62
 
63
63
  if "debug" in options:
64
64
  options.pop("debug")
65
- task(step, options)
65
+
66
+ task(step, options)
66
67
 
67
68
  LOG.info(f"Create step '{step}' completed in {seconds_to_human(time.time()-now)}")
68
69
 
@@ -62,7 +62,8 @@ class Load(Command):
62
62
 
63
63
  if "debug" in options:
64
64
  options.pop("debug")
65
- task(step, options)
65
+
66
+ task(step, options)
66
67
 
67
68
  LOG.info(f"Create step '{step}' completed in {seconds_to_human(time.time()-now)}")
68
69
 
@@ -44,7 +44,7 @@ from .check import check_data_values
44
44
  from .chunks import ChunkFilter
45
45
  from .config import build_output
46
46
  from .config import loader_config
47
- from .input import build_input
47
+ from .input import InputBuilder
48
48
  from .statistics import Summary
49
49
  from .statistics import TmpStatistics
50
50
  from .statistics import check_variance
@@ -101,7 +101,9 @@ def json_tidy(o: Any) -> Any:
101
101
 
102
102
 
103
103
  def build_statistics_dates(
104
- dates: list[datetime.datetime], start: Optional[datetime.datetime], end: Optional[datetime.datetime]
104
+ dates: list[datetime.datetime],
105
+ start: Optional[datetime.datetime],
106
+ end: Optional[datetime.datetime],
105
107
  ) -> tuple[str, str]:
106
108
  """Compute the start and end dates for the statistics.
107
109
 
@@ -551,36 +553,16 @@ class HasElementForDataMixin:
551
553
 
552
554
  self.output = build_output(config.output, parent=self)
553
555
 
554
- self.input = build_input_(main_config=config, output_config=self.output)
555
- # LOG.info("%s", self.input)
556
-
557
-
558
- def build_input_(main_config: Any, output_config: Any) -> Any:
559
- """Build the input for the dataset.
560
-
561
- Parameters
562
- ----------
563
- main_config : Any
564
- The main configuration.
565
- output_config : Any
566
- The output configuration.
567
-
568
- Returns
569
- -------
570
- Any
571
- The input builder.
572
- """
573
- builder = build_input(
574
- main_config.input,
575
- data_sources=main_config.get("data_sources", {}),
576
- order_by=output_config.order_by,
577
- flatten_grid=output_config.flatten_grid,
578
- remapping=build_remapping(output_config.remapping),
579
- use_grib_paramid=main_config.build.use_grib_paramid,
580
- )
581
- LOG.debug("✅ INPUT_BUILDER")
582
- LOG.debug(builder)
583
- return builder
556
+ self.input = InputBuilder(
557
+ config.input,
558
+ data_sources=config.get("data_sources", {}),
559
+ order_by=self.output.order_by,
560
+ flatten_grid=self.output.flatten_grid,
561
+ remapping=build_remapping(self.output.remapping),
562
+ use_grib_paramid=config.build.use_grib_paramid,
563
+ )
564
+ LOG.debug("✅ INPUT_BUILDER")
565
+ LOG.debug(self.input)
584
566
 
585
567
 
586
568
  class Init(Actor, HasRegistryMixin, HasStatisticTempMixin, HasElementForDataMixin):
@@ -1541,7 +1523,16 @@ class Statistics(Actor, HasStatisticTempMixin, HasRegistryMixin):
1541
1523
  if not all(self.registry.get_flags(sync=False)):
1542
1524
  raise Exception(f"❗Zarr {self.path} is not fully built, not writing statistics into dataset.")
1543
1525
 
1544
- for k in ["mean", "stdev", "minimum", "maximum", "sums", "squares", "count", "has_nans"]:
1526
+ for k in [
1527
+ "mean",
1528
+ "stdev",
1529
+ "minimum",
1530
+ "maximum",
1531
+ "sums",
1532
+ "squares",
1533
+ "count",
1534
+ "has_nans",
1535
+ ]:
1545
1536
  self.dataset.add_dataset(name=k, array=stats[k], dimensions=("variable",))
1546
1537
 
1547
1538
  self.registry.add_to_history("compute_statistics_end")
@@ -104,23 +104,3 @@ class InputBuilder:
104
104
  Trace string.
105
105
  """
106
106
  return f"InputBuilder({group_of_dates})"
107
-
108
-
109
- def build_input(config: dict, data_sources: Union[dict, list], **kwargs: Any) -> InputBuilder:
110
- """Build an InputBuilder instance.
111
-
112
- Parameters
113
- ----------
114
- config : dict
115
- Configuration dictionary.
116
- data_sources : Union[dict, list]
117
- Data sources.
118
- **kwargs : Any
119
- Additional keyword arguments.
120
-
121
- Returns
122
- -------
123
- InputBuilder
124
- An instance of InputBuilder.
125
- """
126
- return InputBuilder(config, data_sources, **kwargs)
@@ -459,12 +459,13 @@ class AccumulationFromStart(Accumulation):
459
459
  A tuple representing the MARS date-time step.
460
460
  """
461
461
  assert user_date is None, user_date
462
- assert not frequency, frequency
463
462
 
464
463
  steps = (step1 + add_step, step2 + add_step)
465
464
  if steps[0] == 0:
466
465
  steps = (steps[1],)
467
466
 
467
+ assert frequency == 0 or frequency == (step2 - step1), frequency
468
+
468
469
  return (
469
470
  base_date.year * 10000 + base_date.month * 100 + base_date.day,
470
471
  base_date.hour * 100 + base_date.minute,
@@ -824,6 +825,11 @@ def _compute_accumulations(
824
825
  step1, step2 = user_accumulation_period
825
826
  assert step1 < step2, user_accumulation_period
826
827
 
828
+ if accumulations_reset_frequency is not None:
829
+ AccumulationClass = AccumulationFromLastReset
830
+ else:
831
+ AccumulationClass = AccumulationFromStart if data_accumulation_period in (0, None) else AccumulationFromLastStep
832
+
827
833
  if data_accumulation_period is None:
828
834
  data_accumulation_period = user_accumulation_period[1] - user_accumulation_period[0]
829
835
 
@@ -838,11 +844,6 @@ def _compute_accumulations(
838
844
 
839
845
  base_times = [t // 100 if t > 100 else t for t in base_times]
840
846
 
841
- if accumulations_reset_frequency is not None:
842
- AccumulationClass = AccumulationFromLastReset
843
- else:
844
- AccumulationClass = AccumulationFromStart if data_accumulation_period in (0, None) else AccumulationFromLastStep
845
-
846
847
  mars_date_time_steps = AccumulationClass.mars_date_time_steps(
847
848
  dates=dates,
848
849
  step1=step1,
@@ -179,6 +179,19 @@ class Dataset(ABC, Sized):
179
179
  if "start" in kwargs or "end" in kwargs:
180
180
  start = kwargs.pop("start", None)
181
181
  end = kwargs.pop("end", None)
182
+ padding = kwargs.pop("padding", None)
183
+
184
+ if padding:
185
+ if padding != "empty":
186
+ raise ValueError(f"Only 'empty' padding is supported, got {padding=}")
187
+ from .padded import Padded
188
+
189
+ frequency = kwargs.pop("frequency", self.frequency)
190
+ return (
191
+ Padded(self, start, end, frequency, dict(start=start, end=end, frequency=frequency))
192
+ ._subset(**kwargs)
193
+ .mutate()
194
+ )
182
195
 
183
196
  from .subset import Subset
184
197
 
@@ -724,6 +737,9 @@ class Dataset(ABC, Sized):
724
737
  """Return the grid shape of the dataset."""
725
738
  return (self.shape[-1],)
726
739
 
740
+ def empty_item(self) -> NDArray[Any]:
741
+ return np.zeros((*self.shape[1:-1], 0), dtype=self.dtype)
742
+
727
743
  def _check(self) -> None:
728
744
  """Check for overridden private methods in the dataset."""
729
745
  common = Dataset.__dict__.keys() & self.__class__.__dict__.keys()
@@ -1075,3 +1091,16 @@ class Dataset(ABC, Sized):
1075
1091
  The dataset names.
1076
1092
  """
1077
1093
  pass
1094
+
1095
+ def get_latitudes(self, i):
1096
+ return self.get_aux(i)[0]
1097
+
1098
+ def get_longitudes(self, i):
1099
+ return self.get_aux(i)[1]
1100
+
1101
+ def get_timedeltas(self, i):
1102
+ return self.get_aux(i)[2]
1103
+
1104
+ def get_aux(self, i):
1105
+ # need to decide if Fields datasets need to implement this
1106
+ raise NotImplementedError(f"get_aux is not implemented for this dataset, {type(self)}")
@@ -11,6 +11,7 @@
11
11
  import calendar
12
12
  import datetime
13
13
  import logging
14
+ import os
14
15
  from pathlib import PurePath
15
16
  from typing import TYPE_CHECKING
16
17
  from typing import Any
@@ -22,6 +23,7 @@ from typing import Union
22
23
 
23
24
  import numpy as np
24
25
  import zarr
26
+ from anemoi.utils.config import load_any_dict_format
25
27
  from anemoi.utils.config import load_config as load_settings
26
28
  from numpy.typing import NDArray
27
29
 
@@ -108,7 +110,10 @@ def round_datetime(d: np.datetime64, dates: NDArray[np.datetime64], up: bool) ->
108
110
 
109
111
 
110
112
  def _as_date(
111
- d: Union[int, str, np.datetime64, datetime.date], dates: NDArray[np.datetime64], last: bool
113
+ d: Union[int, str, np.datetime64, datetime.date],
114
+ dates: NDArray[np.datetime64],
115
+ last: bool,
116
+ frequency: Optional[datetime.timedelta] = None,
112
117
  ) -> np.datetime64:
113
118
  """Convert a date to a numpy datetime64 object, rounding to the nearest date in a list of dates.
114
119
 
@@ -120,6 +125,8 @@ def _as_date(
120
125
  The list of dates.
121
126
  last : bool
122
127
  Whether to round to the last date.
128
+ frequency : Optional[datetime.timedelta]
129
+ The frequency of the dataset.
123
130
 
124
131
  Returns
125
132
  -------
@@ -142,30 +149,49 @@ def _as_date(
142
149
  pass
143
150
 
144
151
  if isinstance(d, int):
152
+ delta = frequency
153
+ if delta is None:
154
+ delta = np.timedelta64(1, "s")
155
+ delta = np.timedelta64(delta, "s")
156
+
145
157
  if len(str(d)) == 4:
146
158
  year = d
147
159
  if last:
148
- return _as_date(np.datetime64(f"{year:04}-12-31T23:59:59"), dates, last)
160
+ year = year + 1
161
+ npdate = np.datetime64(f"{year:04}-01-01T00:00:00")
162
+ return _as_date(npdate - delta, dates, last, frequency)
149
163
  else:
150
- return _as_date(np.datetime64(f"{year:04}-01-01T00:00:00"), dates, last)
164
+ return _as_date(np.datetime64(f"{year:04}-01-01T00:00:00"), dates, last, frequency)
151
165
 
152
166
  if len(str(d)) == 6:
153
167
  year = d // 100
154
168
  month = d % 100
155
169
  if last:
156
- _, last_day = calendar.monthrange(year, month)
157
- return _as_date(np.datetime64(f"{year:04}-{month:02}-{last_day:02}T23:59:59"), dates, last)
170
+ month = month + 1
171
+ if month > 12:
172
+ month = 1
173
+ year += 1
174
+ npdate = np.datetime64(f"{year:04}-{month:02}-01T00:00:00")
175
+ return _as_date(npdate - delta, dates, last, frequency)
158
176
  else:
159
- return _as_date(np.datetime64(f"{year:04}-{month:02}-01T00:00:00"), dates, last)
177
+ return _as_date(np.datetime64(f"{year:04}-{month:02}-01T00:00:00"), dates, last, frequency)
160
178
 
161
179
  if len(str(d)) == 8:
162
180
  year = d // 10000
163
181
  month = (d % 10000) // 100
164
182
  day = d % 100
165
183
  if last:
166
- return _as_date(np.datetime64(f"{year:04}-{month:02}-{day:02}T23:59:59"), dates, last)
184
+ day = day + 1
185
+ if day > calendar.monthrange(year, month)[1]:
186
+ day = 1
187
+ month += 1
188
+ if month > 12:
189
+ month = 1
190
+ year += 1
191
+ npdate = np.datetime64(f"{year:04}-{month:02}-{day:02}T00:00:00")
192
+ return _as_date(npdate - delta, dates, last, frequency)
167
193
  else:
168
- return _as_date(np.datetime64(f"{year:04}-{month:02}-{day:02}T00:00:00"), dates, last)
194
+ return _as_date(np.datetime64(f"{year:04}-{month:02}-{day:02}T00:00:00"), dates, last, frequency)
169
195
 
170
196
  if isinstance(d, str):
171
197
 
@@ -201,19 +227,20 @@ def _as_date(
201
227
  np.datetime64(f"{year:04}-{month:02}-{day:02}T{hour:02}:{minute:02}:{second:02}"),
202
228
  dates,
203
229
  last,
230
+ frequency,
204
231
  )
205
232
 
206
233
  if "-" in d:
207
234
  assert ":" not in d
208
235
  bits = d.split("-")
209
236
  if len(bits) == 1:
210
- return _as_date(int(bits[0]), dates, last)
237
+ return _as_date(int(bits[0]), dates, last, frequency)
211
238
 
212
239
  if len(bits) == 2:
213
- return _as_date(int(bits[0]) * 100 + int(bits[1]), dates, last)
240
+ return _as_date(int(bits[0]) * 100 + int(bits[1]), dates, last, frequency)
214
241
 
215
242
  if len(bits) == 3:
216
- return _as_date(int(bits[0]) * 10000 + int(bits[1]) * 100 + int(bits[2]), dates, last)
243
+ return _as_date(int(bits[0]) * 10000 + int(bits[1]) * 100 + int(bits[2]), dates, last, frequency)
217
244
 
218
245
  if ":" in d:
219
246
  assert len(d) == 5
@@ -225,12 +252,16 @@ def _as_date(
225
252
  month = first.month
226
253
  day = first.day
227
254
 
228
- return _as_date(np.datetime64(f"{year:04}-{month:02}-{day:02}T{hour}:00:00"), dates, last)
255
+ return _as_date(np.datetime64(f"{year:04}-{month:02}-{day:02}T{hour}:00:00"), dates, last, frequency)
229
256
 
230
257
  raise NotImplementedError(f"Unsupported date: {d} ({type(d)})")
231
258
 
232
259
 
233
- def as_first_date(d: Union[int, str, np.datetime64, datetime.date], dates: NDArray[np.datetime64]) -> np.datetime64:
260
+ def as_first_date(
261
+ d: Union[int, str, np.datetime64, datetime.date],
262
+ dates: NDArray[np.datetime64],
263
+ frequency: Optional[datetime.timedelta] = None,
264
+ ) -> np.datetime64:
234
265
  """Convert a date to the first date in a list of dates.
235
266
 
236
267
  Parameters
@@ -239,16 +270,22 @@ def as_first_date(d: Union[int, str, np.datetime64, datetime.date], dates: NDArr
239
270
  The date to convert.
240
271
  dates : NDArray[np.datetime64]
241
272
  The list of dates.
273
+ frequency : Optional[datetime.timedelta]
274
+ The frequency of the dataset.
242
275
 
243
276
  Returns
244
277
  -------
245
278
  np.datetime64
246
279
  The first date.
247
280
  """
248
- return _as_date(d, dates, last=False)
281
+ return _as_date(d, dates, last=False, frequency=frequency)
249
282
 
250
283
 
251
- def as_last_date(d: Union[int, str, np.datetime64, datetime.date], dates: NDArray[np.datetime64]) -> np.datetime64:
284
+ def as_last_date(
285
+ d: Union[int, str, np.datetime64, datetime.date],
286
+ dates: NDArray[np.datetime64],
287
+ frequency: Optional[datetime.timedelta] = None,
288
+ ) -> np.datetime64:
252
289
  """Convert a date to the last date in a list of dates.
253
290
 
254
291
  Parameters
@@ -257,13 +294,15 @@ def as_last_date(d: Union[int, str, np.datetime64, datetime.date], dates: NDArra
257
294
  The date to convert.
258
295
  dates : NDArray[np.datetime64]
259
296
  The list of dates.
297
+ frequency : Optional[datetime.timedelta]
298
+ The frequency of the dataset.
260
299
 
261
300
  Returns
262
301
  -------
263
302
  np.datetime64
264
303
  The last date.
265
304
  """
266
- return _as_date(d, dates, last=True)
305
+ return _as_date(d, dates, last=True, frequency=frequency)
267
306
 
268
307
 
269
308
  def _concat_or_join(datasets: List["Dataset"], kwargs: Dict[str, Any]) -> Tuple["Dataset", Dict[str, Any]]:
@@ -317,6 +356,18 @@ def _open(a: Union[str, PurePath, Dict[str, Any], List[Any], Tuple[Any, ...]]) -
317
356
  from .stores import Zarr
318
357
  from .stores import zarr_lookup
319
358
 
359
+ if isinstance(a, str) and len(a.split(".")) in [2, 3]:
360
+
361
+ metadata_path = os.path.join(a, "metadata.json")
362
+ if os.path.exists(metadata_path):
363
+ metadata = load_any_dict_format(metadata_path)
364
+ if "backend" not in metadata:
365
+ raise ValueError(f"Metadata for {a} does not contain 'backend' key")
366
+
367
+ from anemoi.datasets.data.records import open_records_dataset
368
+
369
+ return open_records_dataset(a, backend=metadata["backend"])
370
+
320
371
  if isinstance(a, Dataset):
321
372
  return a.mutate()
322
373
 
@@ -454,6 +505,13 @@ def _open_dataset(*args: Any, **kwargs: Any) -> "Dataset":
454
505
  for a in args:
455
506
  sets.append(_open(a))
456
507
 
508
+ if "observations" in kwargs:
509
+ from .observations import observations_factory
510
+
511
+ assert not sets, sets
512
+
513
+ return observations_factory(args, kwargs).mutate()
514
+
457
515
  if "xy" in kwargs:
458
516
  # Experimental feature, may be removed
459
517
  from .xy import xy_factory