diff --git a/test/test_conventions.py b/test/test_conventions.py index 2c0ac26eb23..ae13a5ff0e0 100644 --- a/test/test_conventions.py +++ b/test/test_conventions.py @@ -2,7 +2,7 @@ import pandas as pd import warnings -from xray import conventions +from xray import conventions, Dataset from . import TestCase, requires_netCDF4 @@ -139,6 +139,27 @@ def test_slice_decoded_cf_datetime_array(self): self.assertEqual(actual.dtype, np.dtype('datetime64[ns]')) self.assertArrayEqual(actual[[0, 2]], expected[[0, 2]]) + @requires_netCDF4 + def test_decode_cf_variable(self): + ds = Dataset({'time': ('time', [0, 1, 2], + {'units': 'days since 1900-01-01', + 'calendar': 'standard'})}) + actual = conventions.decode_cf_variable(ds['time']) + expected = pd.date_range('1900-01-01', periods=3).values + self.assertEqual(actual.dtype, np.dtype('datetime64[ns]')) + self.assertArrayEqual(actual.values, expected) + + actual = conventions.decode_cf_variable(ds['time'].variable) + self.assertEqual(actual.dtype, np.dtype('datetime64[ns]')) + self.assertArrayEqual(actual.values, expected) + + # default calendar + ds = Dataset({'time': ('time', [0, 1, 2], + {'units': 'days since 1900-01-01'})}) + actual = conventions.decode_cf_variable(ds['time']) + self.assertEqual(actual.dtype, np.dtype('datetime64[ns]')) + self.assertArrayEqual(actual.values, expected) + @requires_netCDF4 def test_decode_non_standard_calendar(self): import netCDF4 as nc4 diff --git a/xray/conventions.py b/xray/conventions.py index 7ea7bd33765..69ad682289c 100644 --- a/xray/conventions.py +++ b/xray/conventions.py @@ -413,7 +413,8 @@ def get_to(source, dest, k): def decode_cf_variable(var, concat_characters=True, mask_and_scale=True, decode_times=True): - # use _data instead of data so as not to trigger loading data + var = xray.variable.as_variable(var) + # use _data instead of values so as not to trigger loading data data = var._data dimensions = var.dimensions attributes = var.attrs.copy() @@ -433,7 +434,7 @@ def pop_to(source, dest, k): return v if 'dtype' in encoding: - if var.data.dtype != encoding['dtype']: + if data.dtype != encoding['dtype']: raise ValueError("Refused to overwrite dtype") encoding['dtype'] = data.dtype