From 013d15f216e75aff552638ce3e836f5d00a4b41d Mon Sep 17 00:00:00 2001 From: malmans2 Date: Fri, 23 Jan 2026 12:17:45 +0100 Subject: [PATCH 1/2] Move dimensionless coords to attrs --- tests/test_20_open_dataset.py | 5 ++++- xarray_esgf/client.py | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/tests/test_20_open_dataset.py b/tests/test_20_open_dataset.py index b249153..1ecc0a0 100644 --- a/tests/test_20_open_dataset.py +++ b/tests/test_20_open_dataset.py @@ -63,7 +63,6 @@ def test_open_dataset(tmp_path: Path, index_node: str, download: bool) -> None: assert set(ds.coords) == { "areacella", "experiment_id", - "height", "lat", "lat_bnds", "lon", @@ -77,6 +76,10 @@ def test_open_dataset(tmp_path: Path, index_node: str, download: bool) -> None: if name != "experiment_id" ) + # Dimensionless coords + assert "height" not in ds["pr"].attrs + assert ds["tas"].attrs["height"] == 2.0 + # Data vars assert set(ds.data_vars) == {"pr", "tas"} assert ds["pr"].coordinates == "areacella experiment_id height lat lon time" diff --git a/xarray_esgf/client.py b/xarray_esgf/client.py index fe29d30..bf1162a 100644 --- a/xarray_esgf/client.py +++ b/xarray_esgf/client.py @@ -61,6 +61,17 @@ def add_coordinates_attr_inplace(obj: Dataset | DataArray) -> None: add_coordinates_attr_inplace(da) +def move_dimensionless_coords_to_attrs(ds: Dataset) -> Dataset: + attrs = {} + for var, da in ds.coords.items(): + if not da.dims: + attrs[var] = da.item() + ds = ds.drop_vars(list(attrs)) + for da in ds.data_vars.values(): + da.attrs.update(attrs) + return ds + + @dataclasses.dataclass class Client: selection: dict[str, str | list[str]] @@ -183,11 +194,15 @@ def _open_datasets( (ds,) = datasets else: ds = combine_datasets(datasets) + ds = ds.set_coords([ name for name, da in ds.variables.items() if BOUNDS_DIMS.intersection(da.dims) or "time" not in da.dims ]) + + ds = move_dimensionless_coords_to_attrs(ds) + ds = ds.expand_dims({dim: [dataset_id_dict[dim]] for dim in concat_dims}) combined_datasets[dataset_id] = ds LOGGER.debug(f"{dataset_id}: {dict(ds.sizes)}") From 76871c5f9d768df19215b3c2b6a09efa85ee8edf Mon Sep 17 00:00:00 2001 From: malmans2 Date: Fri, 23 Jan 2026 12:36:34 +0100 Subject: [PATCH 2/2] fix attr --- tests/test_20_open_dataset.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_20_open_dataset.py b/tests/test_20_open_dataset.py index 1ecc0a0..97c363f 100644 --- a/tests/test_20_open_dataset.py +++ b/tests/test_20_open_dataset.py @@ -82,13 +82,13 @@ def test_open_dataset(tmp_path: Path, index_node: str, download: bool) -> None: # Data vars assert set(ds.data_vars) == {"pr", "tas"} - assert ds["pr"].coordinates == "areacella experiment_id height lat lon time" - assert ds["tas"].coordinates == "areacella experiment_id height lat lon time" + assert ds["pr"].coordinates == "areacella experiment_id lat lon time" + assert ds["tas"].coordinates == "areacella experiment_id lat lon time" # Attributes assert ( ds.coordinates - == "areacella experiment_id height lat lat_bnds lon lon_bnds time time_bnds" + == "areacella experiment_id lat lat_bnds lon lon_bnds time time_bnds" ) assert ds.dataset_ids == [ "CMIP6.ScenarioMIP.EC-Earth-Consortium.EC-Earth3-CC.ssp245.r1i1p1f1.Amon.pr.gr.v20210113",