|
13 | 13 | import intake_esgf |
14 | 14 | import intake_esgf.exceptions |
15 | 15 | import iris.cube |
| 16 | +import isodate |
16 | 17 |
|
17 | 18 | from esmvalcore.io.protocol import DataElement, DataSource |
18 | 19 | from esmvalcore.iris_helpers import dataset_to_iris |
| 20 | +from esmvalcore.local import _parse_period |
19 | 21 | from esmvalcore.typing import Facets, FacetValue |
20 | 22 |
|
21 | 23 | __all__ = [ |
@@ -51,11 +53,17 @@ def to_iris(self, ignore_warnings=None) -> iris.cube.CubeList: |
51 | 53 | : |
52 | 54 | The loaded data. |
53 | 55 | """ |
| 56 | + files = self.catalog.to_path_dict( |
| 57 | + minimal_keys=False, |
| 58 | + quiet=True, |
| 59 | + )[self.name] |
54 | 60 | dataset = self.catalog.to_dataset_dict( |
55 | 61 | minimal_keys=False, |
56 | 62 | add_measures=False, |
57 | 63 | quiet=True, |
58 | 64 | )[self.name] |
| 65 | + dataset.attrs["source_file"] = ", ".join(str(f) for f in files) |
| 66 | + |
59 | 67 | return dataset_to_iris(dataset, ignore_warnings=ignore_warnings) |
60 | 68 |
|
61 | 69 |
|
@@ -121,7 +129,17 @@ def find_data(self, **facets: FacetValue) -> list[IntakeESGFDataset]: |
121 | 129 | for our_facet, their_facet in self.facets.items() |
122 | 130 | if our_facet in our_facets |
123 | 131 | } |
124 | | - # TODO: filter by timerange |
| 132 | + if ( |
| 133 | + "timerange" in facets and "*" not in facets["timerange"] # type: ignore[operator] |
| 134 | + ): |
| 135 | + start, end = _parse_period(facets["timerange"]) |
| 136 | + esgf_facets["file_start"] = isodate.date_isoformat( |
| 137 | + isodate.parse_date(start.split("T")[0]), |
| 138 | + ) |
| 139 | + esgf_facets["file_end"] = isodate.date_isoformat( |
| 140 | + isodate.parse_date(end.split("T")[0]), |
| 141 | + ) |
| 142 | + # Search ESGF. |
125 | 143 | try: |
126 | 144 | self.catalog.search(**esgf_facets, quiet=True) |
127 | 145 | except intake_esgf.exceptions.NoSearchResults: |
@@ -156,6 +174,8 @@ def find_data(self, **facets: FacetValue) -> list[IntakeESGFDataset]: |
156 | 174 | dataset_id = row["key"] |
157 | 175 | # Subset the catalog to a single dataset. |
158 | 176 | cat = self.catalog.clone() |
| 177 | + cat.file_start = self.catalog.file_start |
| 178 | + cat.file_end = self.catalog.file_end |
159 | 179 | cat.df = self.catalog.df[self.catalog.df.key == dataset_id] |
160 | 180 | # Discard all but the latest version. It is not clear how/if |
161 | 181 | # `intake_esgf.ESGFCatalog.to_dataset_dict` supports multiple versions. |
|
0 commit comments