diff --git a/xarray/core/dtypes.py b/xarray/core/dtypes.py index 7ad44472f06..a2f11728b4d 100644 --- a/xarray/core/dtypes.py +++ b/xarray/core/dtypes.py @@ -80,6 +80,11 @@ def maybe_promote(dtype): # N.B. these casting rules should match pandas if np.issubdtype(dtype, np.floating): fill_value = np.nan + elif np.issubdtype(dtype, np.timedelta64): + # See https://github.com/numpy/numpy/issues/10685 + # np.timedelta64 is a subclass of np.integer + # Check np.timedelta64 before np.integer + fill_value = np.timedelta64('NaT') elif np.issubdtype(dtype, np.integer): if dtype.itemsize <= 2: dtype = np.float32 @@ -90,8 +95,6 @@ def maybe_promote(dtype): fill_value = np.nan + np.nan * 1j elif np.issubdtype(dtype, np.datetime64): fill_value = np.datetime64('NaT') - elif np.issubdtype(dtype, np.timedelta64): - fill_value = np.timedelta64('NaT') else: dtype = object fill_value = np.nan diff --git a/xarray/tests/test_dtypes.py b/xarray/tests/test_dtypes.py index 833df85f8af..292c60b4d05 100644 --- a/xarray/tests/test_dtypes.py +++ b/xarray/tests/test_dtypes.py @@ -50,3 +50,39 @@ def error(): def test_inf(obj): assert dtypes.INF > obj assert dtypes.NINF < obj + + +@pytest.mark.parametrize("kind, expected", [ + ('a', (np.dtype('O'), 'nan')), # dtype('S') + ('b', (np.float32, 'nan')), # dtype('int8') + ('B', (np.float32, 'nan')), # dtype('uint8') + ('c', (np.dtype('O'), 'nan')), # dtype('S1') + ('D', (np.complex128, '(nan+nanj)')), # dtype('complex128') + ('d', (np.float64, 'nan')), # dtype('float64') + ('e', (np.float16, 'nan')), # dtype('float16') + ('F', (np.complex64, '(nan+nanj)')), # dtype('complex64') + ('f', (np.float32, 'nan')), # dtype('float32') + ('h', (np.float32, 'nan')), # dtype('int16') + ('H', (np.float32, 'nan')), # dtype('uint16') + ('i', (np.float64, 'nan')), # dtype('int32') + ('I', (np.float64, 'nan')), # dtype('uint32') + ('l', (np.float64, 'nan')), # dtype('int64') + ('L', (np.float64, 'nan')), # dtype('uint64') + ('m', (np.timedelta64, 'NaT')), # dtype('