anemoi-datasets 0.5.15__py3-none-any.whl → 0.5.17__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. anemoi/datasets/__init__.py +4 -1
  2. anemoi/datasets/__main__.py +12 -2
  3. anemoi/datasets/_version.py +9 -4
  4. anemoi/datasets/commands/cleanup.py +17 -2
  5. anemoi/datasets/commands/compare.py +18 -2
  6. anemoi/datasets/commands/copy.py +196 -14
  7. anemoi/datasets/commands/create.py +50 -7
  8. anemoi/datasets/commands/finalise-additions.py +17 -2
  9. anemoi/datasets/commands/finalise.py +17 -2
  10. anemoi/datasets/commands/init-additions.py +17 -2
  11. anemoi/datasets/commands/init.py +16 -2
  12. anemoi/datasets/commands/inspect.py +283 -62
  13. anemoi/datasets/commands/load-additions.py +16 -2
  14. anemoi/datasets/commands/load.py +16 -2
  15. anemoi/datasets/commands/patch.py +17 -2
  16. anemoi/datasets/commands/publish.py +17 -2
  17. anemoi/datasets/commands/scan.py +31 -3
  18. anemoi/datasets/compute/recentre.py +47 -11
  19. anemoi/datasets/create/__init__.py +612 -85
  20. anemoi/datasets/create/check.py +142 -20
  21. anemoi/datasets/create/chunks.py +64 -4
  22. anemoi/datasets/create/config.py +185 -21
  23. anemoi/datasets/create/filter.py +50 -0
  24. anemoi/datasets/create/filters/__init__.py +33 -0
  25. anemoi/datasets/create/filters/empty.py +37 -0
  26. anemoi/datasets/create/filters/legacy.py +93 -0
  27. anemoi/datasets/create/filters/noop.py +37 -0
  28. anemoi/datasets/create/filters/orog_to_z.py +58 -0
  29. anemoi/datasets/create/{functions/filters → filters}/pressure_level_relative_humidity_to_specific_humidity.py +33 -10
  30. anemoi/datasets/create/{functions/filters → filters}/pressure_level_specific_humidity_to_relative_humidity.py +32 -8
  31. anemoi/datasets/create/filters/rename.py +205 -0
  32. anemoi/datasets/create/{functions/filters → filters}/rotate_winds.py +43 -28
  33. anemoi/datasets/create/{functions/filters → filters}/single_level_dewpoint_to_relative_humidity.py +32 -9
  34. anemoi/datasets/create/{functions/filters → filters}/single_level_relative_humidity_to_dewpoint.py +33 -9
  35. anemoi/datasets/create/{functions/filters → filters}/single_level_relative_humidity_to_specific_humidity.py +55 -7
  36. anemoi/datasets/create/{functions/filters → filters}/single_level_specific_humidity_to_relative_humidity.py +98 -37
  37. anemoi/datasets/create/filters/speeddir_to_uv.py +95 -0
  38. anemoi/datasets/create/{functions/filters → filters}/sum.py +24 -27
  39. anemoi/datasets/create/filters/transform.py +53 -0
  40. anemoi/datasets/create/{functions/filters → filters}/unrotate_winds.py +27 -18
  41. anemoi/datasets/create/filters/uv_to_speeddir.py +94 -0
  42. anemoi/datasets/create/{functions/filters → filters}/wz_to_w.py +51 -33
  43. anemoi/datasets/create/input/__init__.py +76 -5
  44. anemoi/datasets/create/input/action.py +149 -13
  45. anemoi/datasets/create/input/concat.py +81 -10
  46. anemoi/datasets/create/input/context.py +39 -4
  47. anemoi/datasets/create/input/data_sources.py +72 -6
  48. anemoi/datasets/create/input/empty.py +21 -3
  49. anemoi/datasets/create/input/filter.py +60 -12
  50. anemoi/datasets/create/input/function.py +154 -37
  51. anemoi/datasets/create/input/join.py +86 -14
  52. anemoi/datasets/create/input/misc.py +67 -17
  53. anemoi/datasets/create/input/pipe.py +33 -6
  54. anemoi/datasets/create/input/repeated_dates.py +189 -41
  55. anemoi/datasets/create/input/result.py +202 -87
  56. anemoi/datasets/create/input/step.py +119 -22
  57. anemoi/datasets/create/input/template.py +100 -13
  58. anemoi/datasets/create/input/trace.py +62 -7
  59. anemoi/datasets/create/patch.py +52 -4
  60. anemoi/datasets/create/persistent.py +134 -17
  61. anemoi/datasets/create/size.py +15 -1
  62. anemoi/datasets/create/source.py +51 -0
  63. anemoi/datasets/create/sources/__init__.py +36 -0
  64. anemoi/datasets/create/{functions/sources → sources}/accumulations.py +296 -30
  65. anemoi/datasets/create/{functions/sources → sources}/constants.py +27 -2
  66. anemoi/datasets/create/{functions/sources → sources}/eccc_fstd.py +7 -3
  67. anemoi/datasets/create/sources/empty.py +37 -0
  68. anemoi/datasets/create/{functions/sources → sources}/forcings.py +25 -1
  69. anemoi/datasets/create/sources/grib.py +297 -0
  70. anemoi/datasets/create/{functions/sources → sources}/hindcasts.py +38 -4
  71. anemoi/datasets/create/sources/legacy.py +93 -0
  72. anemoi/datasets/create/{functions/sources → sources}/mars.py +168 -20
  73. anemoi/datasets/create/sources/netcdf.py +42 -0
  74. anemoi/datasets/create/sources/opendap.py +43 -0
  75. anemoi/datasets/create/{functions/sources/__init__.py → sources/patterns.py} +35 -4
  76. anemoi/datasets/create/sources/recentre.py +150 -0
  77. anemoi/datasets/create/{functions/sources → sources}/source.py +27 -5
  78. anemoi/datasets/create/{functions/sources → sources}/tendencies.py +64 -7
  79. anemoi/datasets/create/sources/xarray.py +92 -0
  80. anemoi/datasets/create/sources/xarray_kerchunk.py +36 -0
  81. anemoi/datasets/create/sources/xarray_support/README.md +1 -0
  82. anemoi/datasets/create/{functions/sources/xarray → sources/xarray_support}/__init__.py +109 -8
  83. anemoi/datasets/create/sources/xarray_support/coordinates.py +442 -0
  84. anemoi/datasets/create/{functions/sources/xarray → sources/xarray_support}/field.py +94 -16
  85. anemoi/datasets/create/{functions/sources/xarray → sources/xarray_support}/fieldlist.py +90 -25
  86. anemoi/datasets/create/sources/xarray_support/flavour.py +1036 -0
  87. anemoi/datasets/create/{functions/sources/xarray → sources/xarray_support}/grid.py +92 -31
  88. anemoi/datasets/create/sources/xarray_support/metadata.py +395 -0
  89. anemoi/datasets/create/sources/xarray_support/patch.py +91 -0
  90. anemoi/datasets/create/sources/xarray_support/time.py +391 -0
  91. anemoi/datasets/create/sources/xarray_support/variable.py +331 -0
  92. anemoi/datasets/create/sources/xarray_zarr.py +41 -0
  93. anemoi/datasets/create/{functions/sources → sources}/zenodo.py +34 -5
  94. anemoi/datasets/create/statistics/__init__.py +233 -44
  95. anemoi/datasets/create/statistics/summary.py +52 -6
  96. anemoi/datasets/create/testing.py +76 -0
  97. anemoi/datasets/create/{functions/filters/noop.py → typing.py} +6 -3
  98. anemoi/datasets/create/utils.py +97 -6
  99. anemoi/datasets/create/writer.py +26 -4
  100. anemoi/datasets/create/zarr.py +170 -23
  101. anemoi/datasets/data/__init__.py +51 -4
  102. anemoi/datasets/data/complement.py +191 -40
  103. anemoi/datasets/data/concat.py +141 -16
  104. anemoi/datasets/data/dataset.py +552 -61
  105. anemoi/datasets/data/debug.py +197 -26
  106. anemoi/datasets/data/ensemble.py +93 -8
  107. anemoi/datasets/data/fill_missing.py +165 -18
  108. anemoi/datasets/data/forwards.py +428 -56
  109. anemoi/datasets/data/grids.py +323 -97
  110. anemoi/datasets/data/indexing.py +112 -19
  111. anemoi/datasets/data/interpolate.py +92 -12
  112. anemoi/datasets/data/join.py +158 -19
  113. anemoi/datasets/data/masked.py +129 -15
  114. anemoi/datasets/data/merge.py +137 -23
  115. anemoi/datasets/data/misc.py +172 -16
  116. anemoi/datasets/data/missing.py +233 -29
  117. anemoi/datasets/data/rescale.py +111 -10
  118. anemoi/datasets/data/select.py +168 -26
  119. anemoi/datasets/data/statistics.py +67 -6
  120. anemoi/datasets/data/stores.py +149 -64
  121. anemoi/datasets/data/subset.py +159 -25
  122. anemoi/datasets/data/unchecked.py +168 -57
  123. anemoi/datasets/data/xy.py +168 -25
  124. anemoi/datasets/dates/__init__.py +191 -16
  125. anemoi/datasets/dates/groups.py +189 -47
  126. anemoi/datasets/grids.py +270 -31
  127. anemoi/datasets/testing.py +28 -1
  128. {anemoi_datasets-0.5.15.dist-info → anemoi_datasets-0.5.17.dist-info}/METADATA +10 -7
  129. anemoi_datasets-0.5.17.dist-info/RECORD +137 -0
  130. {anemoi_datasets-0.5.15.dist-info → anemoi_datasets-0.5.17.dist-info}/WHEEL +1 -1
  131. {anemoi_datasets-0.5.15.dist-info → anemoi_datasets-0.5.17.dist-info/licenses}/LICENSE +1 -1
  132. anemoi/datasets/create/functions/__init__.py +0 -66
  133. anemoi/datasets/create/functions/filters/__init__.py +0 -9
  134. anemoi/datasets/create/functions/filters/empty.py +0 -17
  135. anemoi/datasets/create/functions/filters/orog_to_z.py +0 -58
  136. anemoi/datasets/create/functions/filters/rename.py +0 -79
  137. anemoi/datasets/create/functions/filters/speeddir_to_uv.py +0 -78
  138. anemoi/datasets/create/functions/filters/uv_to_speeddir.py +0 -56
  139. anemoi/datasets/create/functions/sources/empty.py +0 -15
  140. anemoi/datasets/create/functions/sources/grib.py +0 -150
  141. anemoi/datasets/create/functions/sources/netcdf.py +0 -15
  142. anemoi/datasets/create/functions/sources/opendap.py +0 -15
  143. anemoi/datasets/create/functions/sources/recentre.py +0 -60
  144. anemoi/datasets/create/functions/sources/xarray/coordinates.py +0 -255
  145. anemoi/datasets/create/functions/sources/xarray/flavour.py +0 -472
  146. anemoi/datasets/create/functions/sources/xarray/metadata.py +0 -148
  147. anemoi/datasets/create/functions/sources/xarray/patch.py +0 -44
  148. anemoi/datasets/create/functions/sources/xarray/time.py +0 -177
  149. anemoi/datasets/create/functions/sources/xarray/variable.py +0 -188
  150. anemoi/datasets/create/functions/sources/xarray_kerchunk.py +0 -42
  151. anemoi/datasets/create/functions/sources/xarray_zarr.py +0 -15
  152. anemoi/datasets/utils/fields.py +0 -47
  153. anemoi_datasets-0.5.15.dist-info/RECORD +0 -129
  154. {anemoi_datasets-0.5.15.dist-info → anemoi_datasets-0.5.17.dist-info}/entry_points.txt +0 -0
  155. {anemoi_datasets-0.5.15.dist-info → anemoi_datasets-0.5.17.dist-info}/top_level.txt +0 -0
@@ -1,177 +0,0 @@
1
- # (C) Copyright 2024 Anemoi contributors.
2
- #
3
- # This software is licensed under the terms of the Apache Licence Version 2.0
4
- # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
5
- #
6
- # In applying this licence, ECMWF does not waive the privileges and immunities
7
- # granted to it by virtue of its status as an intergovernmental organisation
8
- # nor does it submit to any jurisdiction.
9
-
10
-
11
- import datetime
12
- import logging
13
-
14
- from anemoi.utils.dates import as_datetime
15
-
16
- LOG = logging.getLogger(__name__)
17
-
18
-
19
- class Time:
20
-
21
- @classmethod
22
- def from_coordinates(cls, coordinates):
23
- time_coordinate = [c for c in coordinates if c.is_time]
24
- step_coordinate = [c for c in coordinates if c.is_step]
25
- date_coordinate = [c for c in coordinates if c.is_date]
26
-
27
- if len(date_coordinate) == 0 and len(time_coordinate) == 1 and len(step_coordinate) == 1:
28
- return ForecastFromValidTimeAndStep(time_coordinate[0], step_coordinate[0])
29
-
30
- if len(date_coordinate) == 0 and len(time_coordinate) == 1 and len(step_coordinate) == 0:
31
- return Analysis(time_coordinate[0])
32
-
33
- if len(date_coordinate) == 0 and len(time_coordinate) == 0 and len(step_coordinate) == 0:
34
- return Constant()
35
-
36
- if len(date_coordinate) == 1 and len(time_coordinate) == 1 and len(step_coordinate) == 0:
37
- return ForecastFromValidTimeAndBaseTime(date_coordinate[0], time_coordinate[0])
38
-
39
- if len(date_coordinate) == 1 and len(time_coordinate) == 0 and len(step_coordinate) == 1:
40
- return ForecastFromBaseTimeAndDate(date_coordinate[0], step_coordinate[0])
41
-
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)=}")
64
-
65
- def select_valid_datetime(self, variable):
66
- raise NotImplementedError(f"{self.__class__.__name__}.select_valid_datetime()")
67
-
68
-
69
- class Constant(Time):
70
-
71
- def fill_time_metadata(self, coords_values, metadata):
72
- return None
73
-
74
- def select_valid_datetime(self, variable):
75
- return None
76
-
77
-
78
- class Analysis(Time):
79
-
80
- def __init__(self, time_coordinate):
81
- self.time_coordinate_name = time_coordinate.variable.name
82
-
83
- def fill_time_metadata(self, coords_values, metadata):
84
- valid_datetime = coords_values[self.time_coordinate_name]
85
-
86
- metadata["date"] = as_datetime(valid_datetime).strftime("%Y%m%d")
87
- metadata["time"] = as_datetime(valid_datetime).strftime("%H%M")
88
- metadata["step"] = 0
89
-
90
- return valid_datetime
91
-
92
- def select_valid_datetime(self, variable):
93
- return self.time_coordinate_name
94
-
95
-
96
- class ForecastFromValidTimeAndStep(Time):
97
-
98
- def __init__(self, time_coordinate, step_coordinate, date_coordinate=None):
99
- self.time_coordinate_name = time_coordinate.variable.name
100
- self.step_coordinate_name = step_coordinate.variable.name
101
- self.date_coordinate_name = date_coordinate.variable.name if date_coordinate else None
102
-
103
- def fill_time_metadata(self, coords_values, metadata):
104
- valid_datetime = coords_values[self.time_coordinate_name]
105
- step = coords_values[self.step_coordinate_name]
106
-
107
- assert isinstance(step, datetime.timedelta)
108
- base_datetime = valid_datetime - step
109
-
110
- hours = step.total_seconds() / 3600
111
- assert int(hours) == hours
112
-
113
- metadata["date"] = as_datetime(base_datetime).strftime("%Y%m%d")
114
- metadata["time"] = as_datetime(base_datetime).strftime("%H%M")
115
- metadata["step"] = int(hours)
116
-
117
- # When date is present, it should be compatible with time and step
118
-
119
- if self.date_coordinate_name is not None:
120
- # Not sure that this is the correct assumption
121
- assert coords_values[self.date_coordinate_name] == base_datetime, (
122
- coords_values[self.date_coordinate_name],
123
- base_datetime,
124
- )
125
-
126
- return valid_datetime
127
-
128
- def select_valid_datetime(self, variable):
129
- return self.time_coordinate_name
130
-
131
-
132
- class ForecastFromValidTimeAndBaseTime(Time):
133
-
134
- def __init__(self, date_coordinate, time_coordinate):
135
- self.date_coordinate.name = date_coordinate.name
136
- self.time_coordinate.name = time_coordinate.name
137
-
138
- def fill_time_metadata(self, coords_values, metadata):
139
- valid_datetime = coords_values[self.time_coordinate_name]
140
- base_datetime = coords_values[self.date_coordinate_name]
141
-
142
- step = valid_datetime - base_datetime
143
-
144
- hours = step.total_seconds() / 3600
145
- assert int(hours) == hours
146
-
147
- metadata["date"] = as_datetime(base_datetime).strftime("%Y%m%d")
148
- metadata["time"] = as_datetime(base_datetime).strftime("%H%M")
149
- metadata["step"] = int(hours)
150
-
151
- return valid_datetime
152
-
153
- def select_valid_datetime(self, variable):
154
- return self.time_coordinate_name
155
-
156
-
157
- class ForecastFromBaseTimeAndDate(Time):
158
-
159
- def __init__(self, date_coordinate, step_coordinate):
160
- self.date_coordinate_name = date_coordinate.name
161
- self.step_coordinate_name = step_coordinate.name
162
-
163
- def fill_time_metadata(self, coords_values, metadata):
164
-
165
- date = coords_values[self.date_coordinate_name]
166
- step = coords_values[self.step_coordinate_name]
167
- assert isinstance(step, datetime.timedelta)
168
-
169
- metadata["date"] = as_datetime(date).strftime("%Y%m%d")
170
- metadata["time"] = as_datetime(date).strftime("%H%M")
171
-
172
- hours = step.total_seconds() / 3600
173
-
174
- assert int(hours) == hours
175
- metadata["step"] = int(hours)
176
-
177
- return date + step
@@ -1,188 +0,0 @@
1
- # (C) Copyright 2024 Anemoi contributors.
2
- #
3
- # This software is licensed under the terms of the Apache Licence Version 2.0
4
- # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
5
- #
6
- # In applying this licence, ECMWF does not waive the privileges and immunities
7
- # granted to it by virtue of its status as an intergovernmental organisation
8
- # nor does it submit to any jurisdiction.
9
-
10
-
11
- import logging
12
- import math
13
- from functools import cached_property
14
-
15
- import numpy as np
16
-
17
- from .field import XArrayField
18
-
19
- LOG = logging.getLogger(__name__)
20
-
21
-
22
- class Variable:
23
- def __init__(
24
- self,
25
- *,
26
- ds,
27
- variable,
28
- coordinates,
29
- grid,
30
- time,
31
- metadata,
32
- ):
33
- self.ds = ds
34
- self.variable = variable
35
-
36
- self.grid = grid
37
- self.coordinates = coordinates
38
-
39
- self._metadata = metadata.copy()
40
- self._metadata.update({"variable": variable.name, "param": variable.name})
41
-
42
- self.time = time
43
-
44
- self.shape = tuple(len(c.variable) for c in coordinates if c.is_dim and not c.scalar and not c.is_grid)
45
- self.names = {c.variable.name: c for c in coordinates if c.is_dim and not c.scalar and not c.is_grid}
46
- self.by_name = {c.variable.name: c for c in coordinates}
47
-
48
- # We need that alias for the time dimension
49
- self._aliases = dict(valid_datetime="time")
50
-
51
- self.length = math.prod(self.shape)
52
-
53
- @property
54
- def name(self):
55
- return self.variable.name
56
-
57
- def __len__(self):
58
- return self.length
59
-
60
- @property
61
- def grid_mapping(self):
62
- grid_mapping = self.variable.attrs.get("grid_mapping", None)
63
- if grid_mapping is None:
64
- return None
65
- return self.ds[grid_mapping].attrs
66
-
67
- def grid_points(self):
68
- return self.grid.grid_points
69
-
70
- @property
71
- def latitudes(self):
72
- return self.grid.latitudes
73
-
74
- @property
75
- def longitudes(self):
76
- return self.grid.longitudes
77
-
78
- def __repr__(self):
79
- return "Variable[name=%s,coordinates=%s,metadata=%s]" % (
80
- self.variable.name,
81
- self.coordinates,
82
- self._metadata,
83
- )
84
-
85
- def __getitem__(self, i):
86
- """Get a 2D field from the variable"""
87
-
88
- if i >= self.length:
89
- raise IndexError(i)
90
-
91
- coords = np.unravel_index(i, self.shape)
92
- kwargs = {k: v for k, v in zip(self.names, coords)}
93
- return XArrayField(self, self.variable.isel(kwargs))
94
-
95
- def sel(self, missing, **kwargs):
96
-
97
- if not kwargs:
98
- return self
99
-
100
- k, v = kwargs.popitem()
101
-
102
- user_provided_k = k
103
-
104
- if k == "valid_datetime":
105
- # Ask the Time object to select the valid datetime
106
- k = self.time.select_valid_datetime(self)
107
- if k is None:
108
- return None
109
-
110
- c = self.by_name.get(k)
111
-
112
- # assert c is not None, f"Could not find coordinate {k} in {self.variable.name} {self.coordinates} {list(self.by_name)}"
113
-
114
- if c is None:
115
- missing[k] = v
116
- return self.sel(missing, **kwargs)
117
-
118
- i = c.index(v)
119
- if i is None:
120
- if k != user_provided_k:
121
- LOG.warning(f"Could not find {user_provided_k}={v} in {c} (alias of {k})")
122
- else:
123
- LOG.warning(f"Could not find {k}={v} in {c}")
124
- return None
125
-
126
- coordinates = [x.reduced(i) if c is x else x for x in self.coordinates]
127
-
128
- metadata = self._metadata.copy()
129
- metadata.update({k: v})
130
-
131
- variable = Variable(
132
- ds=self.ds,
133
- variable=self.variable.isel({k: i}),
134
- coordinates=coordinates,
135
- grid=self.grid,
136
- time=self.time,
137
- metadata=metadata,
138
- )
139
-
140
- return variable.sel(missing, **kwargs)
141
-
142
- def match(self, **kwargs):
143
-
144
- if "param" in kwargs:
145
- assert "variable" not in kwargs
146
- kwargs["variable"] = kwargs.pop("param")
147
-
148
- if "variable" in kwargs:
149
- name = kwargs.pop("variable")
150
- if not isinstance(name, (list, tuple)):
151
- name = [name]
152
- if self.variable.name not in name:
153
- return False, None
154
- return True, kwargs
155
- return True, kwargs
156
-
157
-
158
- class FilteredVariable:
159
- def __init__(self, variable, **kwargs):
160
- self.variable = variable
161
- self.kwargs = kwargs
162
-
163
- @cached_property
164
- def fields(self):
165
- """Filter the fields of a variable based on metadata.
166
-
167
- Returns
168
- -------
169
- list
170
- A list of fields that match the metadata.
171
- """
172
- return [
173
- field
174
- for field in self.variable
175
- if all(field.metadata(k, default=None) == v for k, v in self.kwargs.items())
176
- ]
177
-
178
- @property
179
- def length(self):
180
- return len(self.fields)
181
-
182
- def __len__(self):
183
- return self.length
184
-
185
- def __getitem__(self, i):
186
- if i >= self.length:
187
- raise IndexError(i)
188
- return self.fields[i]
@@ -1,42 +0,0 @@
1
- # (C) Copyright 2024 Anemoi contributors.
2
- #
3
- # This software is licensed under the terms of the Apache Licence Version 2.0
4
- # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
5
- #
6
- # In applying this licence, ECMWF does not waive the privileges and immunities
7
- # granted to it by virtue of its status as an intergovernmental organisation
8
- # nor does it submit to any jurisdiction.
9
-
10
-
11
- from earthkit.data.core.fieldlist import MultiFieldList
12
-
13
- from . import iterate_patterns
14
- from .xarray import load_one
15
-
16
-
17
- def load_many(emoji, context, dates, pattern, options, **kwargs):
18
-
19
- result = []
20
- options = options.copy() if options is not None else {}
21
-
22
- options.setdefault("engine", "zarr")
23
- options.setdefault("backend_kwargs", {})
24
-
25
- backend_kwargs = options["backend_kwargs"]
26
- backend_kwargs.setdefault("consolidated", False)
27
- backend_kwargs.setdefault("storage_options", {})
28
-
29
- storage_options = backend_kwargs["storage_options"]
30
- storage_options.setdefault("remote_protocol", "s3")
31
- storage_options.setdefault("remote_options", {"anon": True})
32
-
33
- for path, dates in iterate_patterns(pattern, dates, **kwargs):
34
- storage_options["fo"] = path
35
-
36
- result.append(load_one(emoji, context, dates, "reference://", options=options, **kwargs))
37
-
38
- return MultiFieldList(result)
39
-
40
-
41
- def execute(context, dates, json, options=None, **kwargs):
42
- return load_many("🧱", context, dates, json, options, **kwargs)
@@ -1,15 +0,0 @@
1
- # (C) Copyright 2024 Anemoi contributors.
2
- #
3
- # This software is licensed under the terms of the Apache Licence Version 2.0
4
- # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
5
- #
6
- # In applying this licence, ECMWF does not waive the privileges and immunities
7
- # granted to it by virtue of its status as an intergovernmental organisation
8
- # nor does it submit to any jurisdiction.
9
-
10
-
11
- from .xarray import load_many
12
-
13
-
14
- def execute(context, dates, url, *args, **kwargs):
15
- return load_many("🇿", context, dates, url, *args, **kwargs)
@@ -1,47 +0,0 @@
1
- # (C) Copyright 2024 Anemoi contributors.
2
- #
3
- # This software is licensed under the terms of the Apache Licence Version 2.0
4
- # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
5
- #
6
- # In applying this licence, ECMWF does not waive the privileges and immunities
7
- # granted to it by virtue of its status as an intergovernmental organisation
8
- # nor does it submit to any jurisdiction.
9
-
10
-
11
- class WrappedField:
12
- def __init__(self, field):
13
- self._field = field
14
-
15
- def __getattr__(self, name):
16
- return getattr(self._field, name)
17
-
18
- def __repr__(self) -> str:
19
- return repr(self._field)
20
-
21
-
22
- class NewDataField(WrappedField):
23
- def __init__(self, field, data):
24
- super().__init__(field)
25
- self._data = data
26
- self.shape = data.shape
27
-
28
- def to_numpy(self, flatten=False, dtype=None, index=None):
29
- data = self._data
30
- if dtype is not None:
31
- data = data.astype(dtype)
32
- if flatten:
33
- data = data.flatten()
34
- if index is not None:
35
- data = data[index]
36
- return data
37
-
38
-
39
- class NewMetadataField(WrappedField):
40
- def __init__(self, field, **kwargs):
41
- super().__init__(field)
42
- self._metadata = kwargs
43
-
44
- def metadata(self, *args, **kwargs):
45
- if len(args) == 1 and args[0] in self._metadata:
46
- return self._metadata[args[0]]
47
- return self._field.metadata(*args, **kwargs)
@@ -1,129 +0,0 @@
1
- anemoi/datasets/__init__.py,sha256=0GOHATiKgkUqLRgAVQhNP1aPO7ULfSr8DqUf2ANPEv8,1010
2
- anemoi/datasets/__main__.py,sha256=5NW2A3OgTimB4ptwYThivIRSeCrvabMuvnr8mmnVx0E,715
3
- anemoi/datasets/_version.py,sha256=ouj2OiQxA8zuc1Xu0BZzw9hz_rARUPrlwVGV3wH8AoI,413
4
- anemoi/datasets/grids.py,sha256=qG4TDESkbS48AJr7Q5PKgAagkwrz4KpSktnNmn_zTsQ,11673
5
- anemoi/datasets/testing.py,sha256=7HGOz5_V9MbkHTDJ4KbklGRndBMrFfVrBBu6a9k0_qY,1825
6
- anemoi/datasets/commands/__init__.py,sha256=O5W3yHZywRoAqmRUioAr3zMCh0hGVV18wZYGvc00ioM,698
7
- anemoi/datasets/commands/cleanup.py,sha256=2rD34bHtfOCLwQh7yXa02IJmmOYMOma4YDj0PM-2-Jc,1456
8
- anemoi/datasets/commands/compare.py,sha256=8YOlFi9Ydw81qNx4kmI35gvoldUAjYae1enBhxqLrvQ,3256
9
- anemoi/datasets/commands/copy.py,sha256=2owwwcih6mzrmgxrKNmm1B9ngjxZ6q3ZVo3S7grrGWQ,11305
10
- anemoi/datasets/commands/create.py,sha256=Es8BV2d9iazAjiGWaXf5EUmjkGk6-whGHaOEYG34CBU,5567
11
- anemoi/datasets/commands/finalise-additions.py,sha256=ZCUa5CbScR_tEImcJe9AhhGryyrsq1bYhM-dtjaIw7M,1552
12
- anemoi/datasets/commands/finalise.py,sha256=glFj3lhPwf5niybx8u053zMItNjIxYebt3r6E6W2D9Y,1307
13
- anemoi/datasets/commands/init-additions.py,sha256=JFTPu5cGNsmojbkb5DRhKF0rSku0S_2O6wRf7EvjEnM,1540
14
- anemoi/datasets/commands/init.py,sha256=GEPWfBv95DbY7Ssd4wwEHx_4suJ2Dk2S0e3ILrpcoBY,2427
15
- anemoi/datasets/commands/inspect.py,sha256=r6MN59ndyRi9x8yah0xRN__663FKBPU_5rl-eUgPtuM,18795
16
- anemoi/datasets/commands/load-additions.py,sha256=7jmeSKjRzWRpgT0P5Sp9TwUvw7Bo2KbGO645qmIZFDE,1628
17
- anemoi/datasets/commands/load.py,sha256=IAw3zGZ_tY127ziExz62snPhyYM8qgNmLRZY0lX0aPE,1698
18
- anemoi/datasets/commands/patch.py,sha256=UBIO-vhytfuwTzTqlwkpTg-ziRSdoq7GCgpZiO54VDk,1235
19
- anemoi/datasets/commands/publish.py,sha256=z1MV9_1BsEnw81Y_17fHkKGYe8_ZJo9eeQ1kGP5RAsg,1080
20
- anemoi/datasets/commands/scan.py,sha256=mXzYEcYsncxC7ItyL_TlVRiWji6OFYfVxO5OMD9mbEI,3304
21
- anemoi/datasets/compute/__init__.py,sha256=hCW0QcLHJmE-C1r38P27_ZOvCLNewex5iQEtZqx2ckI,393
22
- anemoi/datasets/compute/recentre.py,sha256=tKs-YZLhqsMRBNEUF41hcuMmyvbRuFX07xJq-Cqg2_w,4954
23
- anemoi/datasets/create/__init__.py,sha256=0kGaWi3WA3rD-Jfps6HBa6v8J8CNTvXtoaXeT9DpfgU,36913
24
- anemoi/datasets/create/check.py,sha256=q205XxzR7UtBRI5qOANav_NAVqAERs0aLJ8oBL3VNc4,6153
25
- anemoi/datasets/create/chunks.py,sha256=c7ufk-EamAGqxOI4ScTFlBzdEiH6V1R0f0SPavtZ2Xw,2457
26
- anemoi/datasets/create/config.py,sha256=Tq9kJ-bKhYSTWCXNa8lZIJpO3RteZfCr5hQVM12IgD0,8892
27
- anemoi/datasets/create/patch.py,sha256=YkDiFGV0DDg4WShVrIHhtRaAp9c82mANnR93YTVl36o,4171
28
- anemoi/datasets/create/persistent.py,sha256=V3agRYKbmYqAyhsznsgC3PLSoFbFCSCXqcQZvvJfVTw,4381
29
- anemoi/datasets/create/size.py,sha256=5fIF0yo63dTowojfeG9-MNkgypP5SA94WralxTZwxw4,1055
30
- anemoi/datasets/create/utils.py,sha256=3vRCPOrW0a7ZVx7gsflORwab74LV_BVVkgo_3SgyLpw,3347
31
- anemoi/datasets/create/writer.py,sha256=6XSIgNwKkjrkdnSvr69mXD8McjT3iYJ0d1rOnxaGuCQ,1394
32
- anemoi/datasets/create/zarr.py,sha256=0DkHwKaBpvTOrU1KmScLEfff_KfT1Rw5DXiRMD2d3Ws,5506
33
- anemoi/datasets/create/functions/__init__.py,sha256=qeoEndq4f0gosfyfb-t0CZcLdngJ4GlZIgGs0bp9j0U,1965
34
- anemoi/datasets/create/functions/filters/__init__.py,sha256=SP6ReV1WYIf2Typf1FUaRHhphFGpU9kBoYtI-bYdu5U,395
35
- anemoi/datasets/create/functions/filters/empty.py,sha256=EGLufFcNFoqIXTZj7jQFjtFahMfgCVWj6W5j--u5Q-Q,636
36
- anemoi/datasets/create/functions/filters/noop.py,sha256=5YqumPxlGDOZOrYWayLr8PTycVWG2X_0PmoFi3Hj584,458
37
- anemoi/datasets/create/functions/filters/orog_to_z.py,sha256=PZwqiTVBLlwp2yuHCW_D8Epcb0fPNjzuYYtmL3Gu1XY,1658
38
- anemoi/datasets/create/functions/filters/pressure_level_relative_humidity_to_specific_humidity.py,sha256=jjmocA4WDKCAL49QUFk_3S0JRiPMmeVM7Wlxmfr1v6c,1857
39
- anemoi/datasets/create/functions/filters/pressure_level_specific_humidity_to_relative_humidity.py,sha256=e8LvXUq-qNKJrcjb1DSUXaPeFfxcWxFjGAkm47cOnE8,1855
40
- anemoi/datasets/create/functions/filters/rename.py,sha256=cDF3xmdhwzIZn_nwaO3hxG4fb2vpKtJtmy0ZdLGXyHI,2481
41
- anemoi/datasets/create/functions/filters/rotate_winds.py,sha256=GZq8DFbwOxeROvPS5qVKlYuXq8xKbCAwlZprS6I04Hc,2429
42
- anemoi/datasets/create/functions/filters/single_level_dewpoint_to_relative_humidity.py,sha256=X5HbuMHFQoC2v_SYH4S7ocWFqV4JQUUGybvtyP-twaA,1719
43
- anemoi/datasets/create/functions/filters/single_level_relative_humidity_to_dewpoint.py,sha256=pTM5Hwsi9yeuBmz66m3Zlmr554USoLzgzMMGSMh4BmM,1908
44
- anemoi/datasets/create/functions/filters/single_level_relative_humidity_to_specific_humidity.py,sha256=BnuLrIFcOh_qJBmxwdJqjGqoH0ca5zyKdZgF6QPmJY8,4090
45
- anemoi/datasets/create/functions/filters/single_level_specific_humidity_to_relative_humidity.py,sha256=xqfklEwCqrQlhU6NV8vlVEZdY-hN3SpPpcNny2geVUI,12686
46
- anemoi/datasets/create/functions/filters/speeddir_to_uv.py,sha256=d5t78GToTTXCb1S3HyhTJ2tuwZDnk7UBsHPV4Wn4M_w,2249
47
- anemoi/datasets/create/functions/filters/sum.py,sha256=_f_xyIAbGdKoCXdd5zO7XOL2AHq_c04DFO8s6PhRR8I,1979
48
- anemoi/datasets/create/functions/filters/unrotate_winds.py,sha256=tDFXUSF2flD83W7GgwP1RoVXBUO0445DvQdImulzDzA,2429
49
- anemoi/datasets/create/functions/filters/uv_to_speeddir.py,sha256=niNuTSmyxLn4MGeNL1lowl5M0dH7har-flXy3ZtmKPM,1762
50
- anemoi/datasets/create/functions/filters/wz_to_w.py,sha256=SbTYE6rRjObR-sJEDYyc0-1Kw39zZOAheGMznD7Ic9A,2161
51
- anemoi/datasets/create/functions/sources/__init__.py,sha256=TMm8LerGY7--b0AMUqnz07ZGo-F7I9FF0DGlozcTtSg,1364
52
- anemoi/datasets/create/functions/sources/accumulations.py,sha256=lOICpg8T1sKn7n0X0EkMrNDFBYIqmHYSF_-_LYIEPaw,12527
53
- anemoi/datasets/create/functions/sources/constants.py,sha256=GaiUpJPYupiLWl8O9GEZ9KmlD88pH6dlBiUVrhNl_uA,918
54
- anemoi/datasets/create/functions/sources/eccc_fstd.py,sha256=pcF-N9IarrXuoZ85lmKRbESr8QsSc2VWxUGKT9aNw_M,597
55
- anemoi/datasets/create/functions/sources/empty.py,sha256=YTpOJ3rcb_eS9CbnpwPWBR9r1APIAaG6a_N803YFZFE,500
56
- anemoi/datasets/create/functions/sources/forcings.py,sha256=p442lCOXm8TJFRlP0mgwZujveo9gCtdAGLS4KSIqYfk,661
57
- anemoi/datasets/create/functions/sources/grib.py,sha256=BSieYEnoG92-8lPlrK7CIaGX7qozpkixqHarucDZtLk,4543
58
- anemoi/datasets/create/functions/sources/hindcasts.py,sha256=AWtSW_VoeWIjwjojyAL8FskKMq9fTUfnQ1OI30_J2qA,1677
59
- anemoi/datasets/create/functions/sources/mars.py,sha256=AXz2q1XhvIEVtj0gJNWqcZNkyvXSL-8r6i93GhnmGn4,8890
60
- anemoi/datasets/create/functions/sources/netcdf.py,sha256=GZvd8-d9lQFQ6sJL1usJPtnVqRz2UWqJOX3Fup1CAcI,547
61
- anemoi/datasets/create/functions/sources/opendap.py,sha256=vkbk14-1PFwN9o1wlGROLoF3P-t9WtUVSum6aW_2JoM,545
62
- anemoi/datasets/create/functions/sources/recentre.py,sha256=cCA4TIdRp5r7PaGe7skOuwB1Np9-FcuRX1JXIpUSuyc,1825
63
- anemoi/datasets/create/functions/sources/source.py,sha256=aJHT0USXm52X_Kk_ObXlRJ_xc_1H7g3BG0I2Iumz6h8,1437
64
- anemoi/datasets/create/functions/sources/tendencies.py,sha256=z8iDelu0vvDE8S-Rus6nqg3FIsZNJhojW17ALwkRPxc,4123
65
- anemoi/datasets/create/functions/sources/xarray_kerchunk.py,sha256=8evD6Sype3ffCbmQ0jMBpgR97UeNvkTB5rwchhy4YzY,1446
66
- anemoi/datasets/create/functions/sources/xarray_zarr.py,sha256=3JvoGfQZ4NCUcfxDAbNZOL7z2VRNJzr1H3r8dsWbrgk,545
67
- anemoi/datasets/create/functions/sources/zenodo.py,sha256=rPL9uNPeFTdI9XvVEahtHkxzE18MyrjNXZjpt_sNeH4,1251
68
- anemoi/datasets/create/functions/sources/xarray/__init__.py,sha256=byu5zPP_4b7CjgSKvO3iL4xyZPmdoEVX93Tl7LBZc0c,3174
69
- anemoi/datasets/create/functions/sources/xarray/coordinates.py,sha256=-FkcAaio2KumOd20eb1hLv9rRhjnu-CyqtqzrMsZx18,6213
70
- anemoi/datasets/create/functions/sources/xarray/field.py,sha256=VfEuY-o1KZS1Bn4l7pR8FCx9hTtDbzKzPqJfwunwvRE,3816
71
- anemoi/datasets/create/functions/sources/xarray/fieldlist.py,sha256=3wCLbdqpPlBlzJHKp_ETxAochPA9iFDyF94JVn1DOB8,6281
72
- anemoi/datasets/create/functions/sources/xarray/flavour.py,sha256=6mqldGyx40Zgy4_VkuGWKgrSuPbWKe__nmEradQO5qg,14855
73
- anemoi/datasets/create/functions/sources/xarray/grid.py,sha256=OuLBVv_CdgtLgGACpqhjX8fwtYzM7tfJiwUOXbG_ifw,3644
74
- anemoi/datasets/create/functions/sources/xarray/metadata.py,sha256=zbbb0ssKhZJvogLJ1WPJMBVVHl40GjHWbmE6RzLwAz4,4336
75
- anemoi/datasets/create/functions/sources/xarray/patch.py,sha256=k1v7bUs-sO7-431T0bh5CSTE1FtgjhIlaPQ2-kSpc2E,1051
76
- anemoi/datasets/create/functions/sources/xarray/time.py,sha256=jGnaupnNQr9x4F7ijahzxtMQltC5fLbrEKajq5dIxR8,6458
77
- anemoi/datasets/create/functions/sources/xarray/variable.py,sha256=IdxZGOu1DMaUVlDGyVHuZiGUsN4buJoxexSFUD_NyFg,5029
78
- anemoi/datasets/create/input/__init__.py,sha256=cAwfW9AQiG2PfmZ2Irll7HX8HyiC0Nk1Q9OhoQ84ZAg,1625
79
- anemoi/datasets/create/input/action.py,sha256=SApZApq-_mlOwk1NTERgQlPdPL8lBlIk6rxYX3JBw_E,3857
80
- anemoi/datasets/create/input/concat.py,sha256=DwxgoTSTqNDsVcX5btUBAA7vXtX3G5m-zJ-jDrmAC-c,3279
81
- anemoi/datasets/create/input/context.py,sha256=ohpbdlX7HKVR9peaX_yhx089AeJdhKLPsvPDttcz-uE,1748
82
- anemoi/datasets/create/input/data_sources.py,sha256=lXBD9gJ1EbInKElhUSY7HKz_9wnep9N2RzFJPDcoFbw,2493
83
- anemoi/datasets/create/input/empty.py,sha256=1rWFpHiKIUa-YhlmSSSU0R8dlUVQ9qFVDyJH1NrMmtU,980
84
- anemoi/datasets/create/input/filter.py,sha256=TmUEGFl4hkeXvUeVAwnowO0uEOQ0vn0DQZIhslc2C0Q,2068
85
- anemoi/datasets/create/input/function.py,sha256=F5GQgbtFYmyqFAgNGoGDuWw-xqkcCLzuu20n1TT4GfA,3719
86
- anemoi/datasets/create/input/join.py,sha256=wQP1-vVg4as-R5i3pstgK6HmTJAY7WyWYhCEF6FIU1c,1991
87
- anemoi/datasets/create/input/misc.py,sha256=r7NC_QRYA8iiJJbSFgQnNuixymATK0CPZknGxgYcLOk,1975
88
- anemoi/datasets/create/input/pipe.py,sha256=KfPCtiqyfqkXbmC-2LTqHkCQ7bJY46XMvNDnp9QeHTQ,1344
89
- anemoi/datasets/create/input/repeated_dates.py,sha256=59EvJ_cQwA-p_42cmMFy3pBAAWV0xwPg4E3q2PIofcM,7461
90
- anemoi/datasets/create/input/result.py,sha256=AW6BGDQkrL1XQLXt-h-3lzFOCrVgXjAm3SYk2ZlDfrE,20016
91
- anemoi/datasets/create/input/step.py,sha256=CoowF9mc3kepT8XQ2ObxO750rnQEkYNTviIHQ1m-4UA,2886
92
- anemoi/datasets/create/input/template.py,sha256=Vgi4wQ1aeswLbji0fIzshYhISmzdrt7b0BmgeJJjYGc,1859
93
- anemoi/datasets/create/input/trace.py,sha256=DYXMSnwKqOIx0XWZTKNJojWz4EqaFLknTh6ysxsW9uY,2198
94
- anemoi/datasets/create/statistics/__init__.py,sha256=Z3UXauDVYyfNjsBvfJGjK1unnxEkqNIfpjLCQCiLS2k,12994
95
- anemoi/datasets/create/statistics/summary.py,sha256=wmnz4fZkr6fomXgI8JlMutU8gakfrXTc5ixf3Np7gZA,3385
96
- anemoi/datasets/data/__init__.py,sha256=AW1-Ycj77pWQsZcDGsp0pgTS5rFW6XC4CzuUEIUPAIk,1558
97
- anemoi/datasets/data/complement.py,sha256=hTvA_zTGIHAvZYPv1npVpRpxPg8nXbNTEBAU8r33rlc,5105
98
- anemoi/datasets/data/concat.py,sha256=udtYINuoLOEYYKhi_VpG2-emv80pwZbFAZKwNwXJk3s,5244
99
- anemoi/datasets/data/dataset.py,sha256=mKUwGn_4Rz_Q-RDiCrGjzc0GQGZAWg8xIu-nTs1mcMM,17936
100
- anemoi/datasets/data/debug.css,sha256=z2X_ZDSnZ9C3pyZPWnQiEyAxuMxUaxJxET4oaCImTAQ,211
101
- anemoi/datasets/data/debug.py,sha256=IjCMwtAvknF51PCl_YRYgMZB2iX_9DC5DKILNgl_UHQ,6300
102
- anemoi/datasets/data/ensemble.py,sha256=7ognsmoHDGw0cCs3hsARoV32J1qlQys6iUCJ7XSrARI,2923
103
- anemoi/datasets/data/fill_missing.py,sha256=4btLi-D-hFTsS_57_gIC1nK5AVifAO-V4M-fqMrtrxk,4636
104
- anemoi/datasets/data/forwards.py,sha256=P9DfSY5B9w9gtkKfV6TIzXel_LY83g-2nEreJy2rYkU,8916
105
- anemoi/datasets/data/grids.py,sha256=p7_nT7RLH6uKcxeAzQiGYk9lFxU_OOikDrwlb2rdEqI,15765
106
- anemoi/datasets/data/indexing.py,sha256=9lycQXSqUIbYj52JlFv0w_Gf6soVZnbVGswYMvGPpqs,4773
107
- anemoi/datasets/data/interpolate.py,sha256=D27lSH8yNhm0aoO0U3UoRbr3kni7OWXSu_X4jCbIrA0,4137
108
- anemoi/datasets/data/join.py,sha256=IG9Bj4o4Z25cl5YGMqtl75UuSZCWIJwGIUB0fsfnkE8,5456
109
- anemoi/datasets/data/masked.py,sha256=eAVGVmQR7tWsd3xXYGXGyq28uRLwL50vOXWTNNdHxl0,4530
110
- anemoi/datasets/data/merge.py,sha256=dr0sX2ufm-qOgOAMV5oh8qQwPvSdYbU-mhux6u-cmQw,5547
111
- anemoi/datasets/data/misc.py,sha256=lYRE-vfRIra9bhyG3-kdruoQvxyYWaE9EN9qTFoM7bA,11074
112
- anemoi/datasets/data/missing.py,sha256=SWEjiC1usBjZtlKMr73uKetnoQZoflVQVGqLP2gJR7A,7131
113
- anemoi/datasets/data/rescale.py,sha256=wMU7tFZebnOqJJxaIGOqNqhpNKGsPNZMC1YxuiHvri4,4112
114
- anemoi/datasets/data/select.py,sha256=XW_ohlhrF8FLe13pdM3DRZDxbHxntcsO0F56GRqZQY0,4293
115
- anemoi/datasets/data/statistics.py,sha256=vBVrLpI2rLQHo-qRDBwTc1N9pWkVXYONU2wdhpp_5Gc,1619
116
- anemoi/datasets/data/stores.py,sha256=4Ax_fA6OEwkDRVRIYfwFNbbQzbQVuiDquJolF7KfNZA,14320
117
- anemoi/datasets/data/subset.py,sha256=M9oVdwjMdDEEtpri6qcGCTL9l6Xw2epA7DFusy9IOsg,4806
118
- anemoi/datasets/data/unchecked.py,sha256=Vk9P3Y-JGgsWTcOhb878qV_dJv3lP4S-4I8rFWnRAJI,4278
119
- anemoi/datasets/data/xy.py,sha256=YzAB12jq-IoCHcjbZlS4SJKLK8e2QvIIfPwHDgkH5vM,3568
120
- anemoi/datasets/dates/__init__.py,sha256=wX2FvlmRfHV5HDmllIxwfrC1LuRlb7i6SguLLasP0l4,8042
121
- anemoi/datasets/dates/groups.py,sha256=i7x8z0kv6E8qUfm1tMZR1aaOqNwQzEkV-VWpOvHjoX4,5390
122
- anemoi/datasets/utils/__init__.py,sha256=hCW0QcLHJmE-C1r38P27_ZOvCLNewex5iQEtZqx2ckI,393
123
- anemoi/datasets/utils/fields.py,sha256=l7xKOiRLgk9Eewykqu7xZP9xOajG2dx2CiDlGvBVejU,1411
124
- anemoi_datasets-0.5.15.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
125
- anemoi_datasets-0.5.15.dist-info/METADATA,sha256=nkzeOXbApDa2miJ_QDAcVzloug1O41ZkYQVYkpD41b4,15607
126
- anemoi_datasets-0.5.15.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
127
- anemoi_datasets-0.5.15.dist-info/entry_points.txt,sha256=yR-o-4uiPEA_GLBL81SkMYnUoxq3CAV3hHulQiRtGG0,66
128
- anemoi_datasets-0.5.15.dist-info/top_level.txt,sha256=DYn8VPs-fNwr7fNH9XIBqeXIwiYYd2E2k5-dUFFqUz0,7
129
- anemoi_datasets-0.5.15.dist-info/RECORD,,