|
9 | 9 | from xray import Variable, Dataset, DataArray
|
10 | 10 | from xray.variable import (Coordinate, as_variable, NumpyArrayAdapter,
|
11 | 11 | PandasIndexAdapter)
|
| 12 | +from xray.pycompat import PY3 |
12 | 13 |
|
13 | 14 | from . import TestCase, source_ndarray
|
14 | 15 |
|
@@ -36,32 +37,85 @@ def test_attrs(self):
|
36 | 37 | v.attrs['foo'] = 'baz'
|
37 | 38 | self.assertEqual(v.attrs['foo'], 'baz')
|
38 | 39 |
|
39 |
| - def test_0d_data(self): |
40 |
| - d = datetime(2000, 1, 1) |
41 |
| - for value, dtype in [(0, int), |
42 |
| - (np.float32(0.5), np.float32), |
43 |
| - ('foo', np.str_), |
44 |
| - (d, None), |
45 |
| - (np.datetime64(d), np.datetime64)]: |
| 40 | + def assertIndexedLikeNDArray(self, variable, expected_value0, |
| 41 | + expected_dtype=None): |
| 42 | + """Given a 1-dimensional variable, verify that the variable is indexed |
| 43 | + like a numpy.ndarray. |
| 44 | + """ |
| 45 | + self.assertEqual(variable[0].shape, ()) |
| 46 | + self.assertEqual(variable[0].ndim, 0) |
| 47 | + self.assertEqual(variable[0].size, 1) |
| 48 | + # test identity |
| 49 | + self.assertTrue(variable.equals(variable.copy())) |
| 50 | + self.assertTrue(variable.identical(variable.copy())) |
| 51 | + # check value is equal for both ndarray and Variable |
| 52 | + self.assertEqual(variable.values[0], expected_value0) |
| 53 | + self.assertEqual(variable[0].values, expected_value0) |
| 54 | + # check type or dtype is consistent for both ndarray and Variable |
| 55 | + if expected_dtype is None: |
| 56 | + # check output type instead of array dtype |
| 57 | + self.assertEqual(type(variable.values[0]), type(expected_value0)) |
| 58 | + self.assertEqual(type(variable[0].values), type(expected_value0)) |
| 59 | + else: |
| 60 | + self.assertEqual(variable.values[0].dtype, expected_dtype) |
| 61 | + self.assertEqual(variable[0].values.dtype, expected_dtype) |
| 62 | + |
| 63 | + def test_index_0d_int(self): |
| 64 | + for value, dtype in [(0, np.int_), |
| 65 | + (np.int32(0), np.int32)]: |
| 66 | + x = self.cls(['x'], [value]) |
| 67 | + self.assertIndexedLikeNDArray(x, value, dtype) |
| 68 | + |
| 69 | + def test_index_0d_float(self): |
| 70 | + for value, dtype in [(0.5, np.float_), |
| 71 | + (np.float32(0.5), np.float32)]: |
| 72 | + x = self.cls(['x'], [value]) |
| 73 | + self.assertIndexedLikeNDArray(x, value, dtype) |
| 74 | + |
| 75 | + def test_index_0d_string(self): |
| 76 | + for value, dtype in [('foo', np.dtype('U3' if PY3 else 'S3')), |
| 77 | + (u'foo', np.dtype('U3'))]: |
46 | 78 | x = self.cls(['x'], [value])
|
47 |
| - # check array properties |
48 |
| - self.assertEqual(x[0].shape, ()) |
49 |
| - self.assertEqual(x[0].ndim, 0) |
50 |
| - self.assertEqual(x[0].size, 1) |
51 |
| - # test identity |
52 |
| - self.assertTrue(x.equals(x.copy())) |
53 |
| - self.assertTrue(x.identical(x.copy())) |
54 |
| - # check value is equal for both ndarray and Variable |
55 |
| - self.assertEqual(x.values[0], value) |
56 |
| - self.assertEqual(x[0].values, value) |
57 |
| - # check type or dtype is consistent for both ndarray and Variable |
58 |
| - if dtype is None: |
59 |
| - # check output type instead of array dtype |
60 |
| - self.assertEqual(type(x.values[0]), type(value)) |
61 |
| - self.assertEqual(type(x[0].values), type(value)) |
62 |
| - else: |
63 |
| - assert np.issubdtype(x.values[0].dtype, dtype), (x.values[0].dtype, dtype) |
64 |
| - assert np.issubdtype(x[0].values.dtype, dtype), (x[0].values.dtype, dtype) |
| 79 | + self.assertIndexedLikeNDArray(x, value, dtype) |
| 80 | + |
| 81 | + def test_index_0d_datetime(self): |
| 82 | + d = datetime(2000, 1, 1) |
| 83 | + x = self.cls(['x'], [d]) |
| 84 | + self.assertIndexedLikeNDArray(x, d) |
| 85 | + |
| 86 | + x = self.cls(['x'], [np.datetime64(d)]) |
| 87 | + self.assertIndexedLikeNDArray(x, np.datetime64(d), 'datetime64[ns]') |
| 88 | + |
| 89 | + x = self.cls(['x'], pd.DatetimeIndex([d])) |
| 90 | + self.assertIndexedLikeNDArray(x, np.datetime64(d), 'datetime64[ns]') |
| 91 | + |
| 92 | + def test_index_0d_object(self): |
| 93 | + |
| 94 | + class HashableItemWrapper(object): |
| 95 | + def __init__(self, item): |
| 96 | + self.item = item |
| 97 | + |
| 98 | + def __eq__(self, other): |
| 99 | + return self.item == other.item |
| 100 | + |
| 101 | + def __hash__(self): |
| 102 | + return hash(self.item) |
| 103 | + |
| 104 | + def __repr__(self): |
| 105 | + return '%s(item=%r)' % (type(self).__name__, self.item) |
| 106 | + |
| 107 | + item = HashableItemWrapper((1, 2, 3)) |
| 108 | + x = self.cls('x', [item]) |
| 109 | + self.assertIndexedLikeNDArray(x, item) |
| 110 | + |
| 111 | + def test_index_and_concat_datetime64(self): |
| 112 | + # regression test for #125 |
| 113 | + expected = self.cls('t', pd.date_range('2011-09-01', periods=10)) |
| 114 | + for times in [[expected[i] for i in range(10)], |
| 115 | + [expected[[i]] for i in range(10)]]: |
| 116 | + actual = Variable.concat(times, 't') |
| 117 | + self.assertArrayEqual(expected, actual) |
| 118 | + self.assertEqual(expected.dtype, actual.dtype) |
65 | 119 |
|
66 | 120 | def test_0d_time_data(self):
|
67 | 121 | # regression test for #105
|
@@ -229,6 +283,30 @@ def test_item(self):
|
229 | 283 | self.assertEqual(v.item(), 0)
|
230 | 284 | self.assertIs(type(v.item()), float)
|
231 | 285 |
|
| 286 | + def test_datetime64_precision(self): |
| 287 | + # verify that datetime64 is always converted to ns precision |
| 288 | + values = np.datetime64('2000-01-01T00') |
| 289 | + v = Variable([], values) |
| 290 | + self.assertEqual(v.dtype, np.dtype('datetime64[ns]')) |
| 291 | + self.assertEqual(v.values, values) |
| 292 | + self.assertEqual(v.values.dtype, np.dtype('datetime64[ns]')) |
| 293 | + |
| 294 | + values = pd.date_range('2000-01-01', periods=3).values.astype( |
| 295 | + 'datetime64[s]') |
| 296 | + v = Variable(['t'], values) |
| 297 | + self.assertEqual(v.dtype, np.dtype('datetime64[ns]')) |
| 298 | + self.assertArrayEqual(v.values, values) |
| 299 | + self.assertEqual(v.values.dtype, np.dtype('datetime64[ns]')) |
| 300 | + |
| 301 | + def test_0d_str(self): |
| 302 | + v = Variable([], u'foo') |
| 303 | + self.assertEqual(v.dtype, np.dtype('U3')) |
| 304 | + self.assertEqual(v.values, 'foo') |
| 305 | + |
| 306 | + v = Variable([], np.string_('foo')) |
| 307 | + self.assertEqual(v.dtype, np.dtype('S3')) |
| 308 | + self.assertEqual(v.values, bytes('foo', 'ascii') if PY3 else 'foo') |
| 309 | + |
232 | 310 | def test_equals_and_identical(self):
|
233 | 311 | d = np.random.rand(10, 3)
|
234 | 312 | d[0, 0] = np.nan
|
|
0 commit comments