Skip to content

Commit 5ed9838

Browse files
authored
Propagate attrs for multi-index levels (#324)
1 parent f458020 commit 5ed9838

File tree

2 files changed

+17
-11
lines changed

2 files changed

+17
-11
lines changed

cf_xarray/coding.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,11 @@ def encode_multi_index_as_compress(ds, idxnames=None):
4747
mindex = ds.indexes[idxname]
4848
coords = dict(zip(mindex.names, mindex.levels))
4949
encoded.update(coords)
50+
for c in coords:
51+
encoded[c].attrs = ds[c].attrs
52+
encoded[c].encoding = ds[c].encoding
5053
encoded[idxname] = np.ravel_multi_index(mindex.codes, mindex.levshape)
51-
encoded[idxname].attrs = ds[idxname].attrs
54+
encoded[idxname].attrs = ds[idxname].attrs.copy()
5255
if (
5356
"compress" in encoded[idxname].encoding
5457
or "compress" in encoded[idxname].attrs
@@ -83,7 +86,7 @@ def decode_compress_to_multi_index(encoded, idxnames=None):
8386
----------
8487
CF conventions on `compression by gathering <http://cfconventions.org/Data/cf-conventions/cf-conventions-1.8/cf-conventions.html#compression-by-gathering>`_
8588
"""
86-
decoded = xr.Dataset()
89+
decoded = xr.Dataset(data_vars=encoded.data_vars, attrs=encoded.attrs.copy())
8790
if idxnames is None:
8891
idxnames = tuple(
8992
name for name in encoded.indexes if "compress" in encoded[name].attrs
@@ -108,13 +111,9 @@ def decode_compress_to_multi_index(encoded, idxnames=None):
108111

109112
decoded.coords[idxname] = mindex
110113
decoded.coords[idxname].attrs = encoded[idxname].attrs.copy()
114+
for coord in mindex.names:
115+
decoded[coord].attrs = encoded[coord].attrs.copy()
116+
decoded[coord].encoding = encoded[coord].encoding.copy()
111117
del decoded[idxname].attrs["compress"]
112118

113-
for varname in encoded.data_vars:
114-
if idxname in encoded[varname].dims:
115-
decoded[varname] = (
116-
idxname,
117-
encoded[varname].data,
118-
encoded[varname].attrs,
119-
)
120119
return decoded

cf_xarray/tests/test_coding.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,16 @@
2121
@pytest.mark.parametrize("idxnames", ["landpoint", ("landpoint",), None])
2222
def test_compression_by_gathering_multi_index_roundtrip(mindex, idxnames):
2323
dataset = xr.Dataset(
24-
{"landsoilt": ("landpoint", np.random.randn(4), {"foo": "bar"})},
25-
{"landpoint": ("landpoint", mindex, {"long_name": "land point number"})},
24+
data_vars={"landsoilt": ("landpoint", np.random.randn(4), {"foo": "bar"})},
25+
coords={
26+
"landpoint": ("landpoint", mindex, {"long_name": "land point number"}),
27+
"coord1": ("landpoint", [1, 2, 3, 4], {"foo": "baz"}),
28+
},
29+
attrs={"dataset": "test dataset"},
2630
)
31+
dataset.lat.attrs["standard_name"] = "latitude"
32+
dataset.lon.attrs["standard_name"] = "longitude"
33+
2734
encoded = cfxr.encode_multi_index_as_compress(dataset, idxnames)
2835
roundtrip = cfxr.decode_compress_to_multi_index(encoded, idxnames)
2936
assert "compress" not in roundtrip["landpoint"].encoding

0 commit comments

Comments
 (0)