Skip to content

Commit a9d1f3a

Browse files
rabernatshoyer
authored andcommitted
Fix decode cf with dask (#2047)
* fixes #1372 * what's new
1 parent 8f96db4 commit a9d1f3a

File tree

3 files changed

+18
-4
lines changed

3 files changed

+18
-4
lines changed

doc/whats-new.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ Enhancements
5555
Bug fixes
5656
~~~~~~~~~
5757

58+
- Fixed ``decode_cf`` function to operate lazily on dask arrays
59+
(:issue:`1372`). By `Ryan Abernathey <https://github.com/rabernat>`_.
5860
- Fixed labeled indexing with slice bounds given by xarray objects with
5961
datetime64 or timedelta64 dtypes (:issue:`1240`).
6062
By `Stephan Hoyer <https://github.com/shoyer>`_.

xarray/conventions.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from .coding import times, variables
1010
from .coding.variables import SerializationWarning
1111
from .core import duck_array_ops, indexing
12-
from .core.pycompat import OrderedDict, basestring, iteritems
12+
from .core.pycompat import OrderedDict, basestring, iteritems, dask_array_type
1313
from .core.variable import IndexVariable, Variable, as_variable
1414

1515

@@ -490,8 +490,9 @@ def decode_cf_variable(name, var, concat_characters=True, mask_and_scale=True,
490490
del attributes['dtype']
491491
data = BoolTypeArray(data)
492492

493-
return Variable(dimensions, indexing.LazilyOuterIndexedArray(data),
494-
attributes, encoding=encoding)
493+
if not isinstance(data, dask_array_type):
494+
data = indexing.LazilyOuterIndexedArray(data)
495+
return Variable(dimensions, data, attributes, encoding=encoding)
495496

496497

497498
def decode_cf_variables(variables, attributes, concat_characters=True,

xarray/tests/test_conventions.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
from . import (
2020
IndexerMaker, TestCase, assert_array_equal, raises_regex, requires_netCDF4,
21-
requires_netcdftime, unittest)
21+
requires_netcdftime, unittest, requires_dask)
2222
from .test_backends import CFEncodedDataTest
2323

2424
B = IndexerMaker(indexing.BasicIndexer)
@@ -332,6 +332,17 @@ def test_decode_cf_datetime_transition_to_invalid(self):
332332

333333
assert_array_equal(ds_decoded.time.values, expected)
334334

335+
@requires_dask
336+
def test_decode_cf_with_dask(self):
337+
import dask
338+
original = Dataset({
339+
't': ('t', [0, 1, 2], {'units': 'days since 2000-01-01'}),
340+
'foo': ('t', [0, 0, 0], {'coordinates': 'y', 'units': 'bar'}),
341+
'y': ('t', [5, 10, -999], {'_FillValue': -999})
342+
}).chunk({'t': 1})
343+
decoded = conventions.decode_cf(original)
344+
assert dask.is_dask_collection(decoded.y.data)
345+
335346

336347
class CFEncodedInMemoryStore(WritableCFDataStore, InMemoryDataStore):
337348
pass

0 commit comments

Comments
 (0)