Skip to content

Commit 477ca0e

Browse files
authored
Move dimensionless coords to attrs (#39)
* Move dimensionless coords to attrs * fix attr
1 parent f10bfc8 commit 477ca0e

2 files changed

Lines changed: 22 additions & 4 deletions

File tree

tests/test_20_open_dataset.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ def test_open_dataset(tmp_path: Path, index_node: str, download: bool) -> None:
6363
assert set(ds.coords) == {
6464
"areacella",
6565
"experiment_id",
66-
"height",
6766
"lat",
6867
"lat_bnds",
6968
"lon",
@@ -77,15 +76,19 @@ def test_open_dataset(tmp_path: Path, index_node: str, download: bool) -> None:
7776
if name != "experiment_id"
7877
)
7978

79+
# Dimensionless coords
80+
assert "height" not in ds["pr"].attrs
81+
assert ds["tas"].attrs["height"] == 2.0
82+
8083
# Data vars
8184
assert set(ds.data_vars) == {"pr", "tas"}
82-
assert ds["pr"].coordinates == "areacella experiment_id height lat lon time"
83-
assert ds["tas"].coordinates == "areacella experiment_id height lat lon time"
85+
assert ds["pr"].coordinates == "areacella experiment_id lat lon time"
86+
assert ds["tas"].coordinates == "areacella experiment_id lat lon time"
8487

8588
# Attributes
8689
assert (
8790
ds.coordinates
88-
== "areacella experiment_id height lat lat_bnds lon lon_bnds time time_bnds"
91+
== "areacella experiment_id lat lat_bnds lon lon_bnds time time_bnds"
8992
)
9093
assert ds.dataset_ids == [
9194
"CMIP6.ScenarioMIP.EC-Earth-Consortium.EC-Earth3-CC.ssp245.r1i1p1f1.Amon.pr.gr.v20210113",

xarray_esgf/client.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,17 @@ def add_coordinates_attr_inplace(obj: Dataset | DataArray) -> None:
6161
add_coordinates_attr_inplace(da)
6262

6363

64+
def move_dimensionless_coords_to_attrs(ds: Dataset) -> Dataset:
65+
attrs = {}
66+
for var, da in ds.coords.items():
67+
if not da.dims:
68+
attrs[var] = da.item()
69+
ds = ds.drop_vars(list(attrs))
70+
for da in ds.data_vars.values():
71+
da.attrs.update(attrs)
72+
return ds
73+
74+
6475
@dataclasses.dataclass
6576
class Client:
6677
selection: dict[str, str | list[str]]
@@ -183,11 +194,15 @@ def _open_datasets(
183194
(ds,) = datasets
184195
else:
185196
ds = combine_datasets(datasets)
197+
186198
ds = ds.set_coords([
187199
name
188200
for name, da in ds.variables.items()
189201
if BOUNDS_DIMS.intersection(da.dims) or "time" not in da.dims
190202
])
203+
204+
ds = move_dimensionless_coords_to_attrs(ds)
205+
191206
ds = ds.expand_dims({dim: [dataset_id_dict[dim]] for dim in concat_dims})
192207
combined_datasets[dataset_id] = ds
193208
LOGGER.debug(f"{dataset_id}: {dict(ds.sizes)}")

0 commit comments

Comments
 (0)