@@ -47,8 +47,11 @@ def encode_multi_index_as_compress(ds, idxnames=None):
47
47
mindex = ds .indexes [idxname ]
48
48
coords = dict (zip (mindex .names , mindex .levels ))
49
49
encoded .update (coords )
50
+ for c in coords :
51
+ encoded [c ].attrs = ds [c ].attrs
52
+ encoded [c ].encoding = ds [c ].encoding
50
53
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 ()
52
55
if (
53
56
"compress" in encoded [idxname ].encoding
54
57
or "compress" in encoded [idxname ].attrs
@@ -83,7 +86,7 @@ def decode_compress_to_multi_index(encoded, idxnames=None):
83
86
----------
84
87
CF conventions on `compression by gathering <http://cfconventions.org/Data/cf-conventions/cf-conventions-1.8/cf-conventions.html#compression-by-gathering>`_
85
88
"""
86
- decoded = xr .Dataset ()
89
+ decoded = xr .Dataset (data_vars = encoded . data_vars , attrs = encoded . attrs . copy () )
87
90
if idxnames is None :
88
91
idxnames = tuple (
89
92
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):
108
111
109
112
decoded .coords [idxname ] = mindex
110
113
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 ()
111
117
del decoded [idxname ].attrs ["compress" ]
112
118
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
- )
120
119
return decoded
0 commit comments