Repository: pydata/xarray (Python)

Issue:
Unexpected decoded time in xarray >= 0.10.1
#### Problem description

Given the original time dimension:
```python
ds = xr.open_mfdataset("C:\\Users\\janis\\.cate\\data_stores\\local\\local.SST_should_fail\\*.nc", decode_cf=False)
```
```
<xarray.DataArray 'time' (time: 32)>
array([788961600, 789048000, 789134400, 789220800, 789307200, 789393600,
       789480000, 789566400, 789652800, 789739200, 789825600, 789912000,
       789998400, 790084800, 790171200, 790257600, 790344000, 790430400,
       790516800, 790603200, 790689600, 790776000, 790862400, 790948800,
       791035200, 791121600, 791208000, 791294400, 791380800, 791467200,
       791553600, 791640000], dtype=int64)
Coordinates:
  * time     (time) int64 788961600 789048000 789134400 789220800 789307200 ...
Attributes:
    standard_name:  time
    axis:           T
    comment:        
    bounds:         time_bnds
    long_name:      reference time of sst file
    _ChunkSizes:    1
    units:          seconds since 1981-01-01
    calendar:       gregorian
```
Produces this decoded time dimension with `xarray >= 0.10.1`:
```python
ds = xr.open_mfdataset("C:\\Users\\janis\\.cate\\data_stores\\local\\local.SST_should_fail\\*.nc", decode_cf=True)
```
```
<xarray.DataArray 'time' (time: 32)>
array(['1981-01-01T00:00:00.627867648', '1980-12-31T23:59:58.770774016',
       '1981-01-01T00:00:01.208647680', '1980-12-31T23:59:59.351554048',
       '1981-01-01T00:00:01.789427712', '1980-12-31T23:59:59.932334080',
       '1980-12-31T23:59:58.075240448', '1981-01-01T00:00:00.513114112',
       '1980-12-31T23:59:58.656020480', '1981-01-01T00:00:01.093894144',
       '1980-12-31T23:59:59.236800512', '1981-01-01T00:00:01.674674176',
       '1980-12-31T23:59:59.817580544', '1980-12-31T23:59:57.960486912',
       '1981-01-01T00:00:00.398360576', '1980-12-31T23:59:58.541266944',
       '1981-01-01T00:00:00.979140608', '1980-12-31T23:59:59.122046976',
       '1981-01-01T00:00:01.559920640', '1980-12-31T23:59:59.702827008',
       '1981-01-01T00:00:02.140700672', '1981-01-01T00:00:00.283607040',
       '1980-12-31T23:59:58.426513408', '1981-01-01T00:00:00.864387072',
       '1980-12-31T23:59:59.007293440', '1981-01-01T00:00:01.445167104',
       '1980-12-31T23:59:59.588073472', '1981-01-01T00:00:02.025947136',
       '1981-01-01T00:00:00.168853504', '1980-12-31T23:59:58.311759872',
       '1981-01-01T00:00:00.749633536', '1980-12-31T23:59:58.892539904'],
      dtype='datetime64[ns]')
Coordinates:
  * time     (time) datetime64[ns] 1981-01-01T00:00:00.627867648 ...
Attributes:
    standard_name:  time
    axis:           T
    comment:        
    bounds:         time_bnds
    long_name:      reference time of sst file
    _ChunkSizes:    1
```

#### Expected Output
With ``xarray == 0.10.0`` the output is as expected:
```python
ds = xr.open_mfdataset("C:\\Users\\janis\\.cate\\data_stores\\local\\local.SST_should_fail\\*.nc",
                       decode_cf=True)
```
```
<xarray.DataArray 'time' (time: 32)>
array(['2006-01-01T12:00:00.000000000', '2006-01-02T12:00:00.000000000',
       '2006-01-03T12:00:00.000000000', '2006-01-04T12:00:00.000000000',
       '2006-01-05T12:00:00.000000000', '2006-01-06T12:00:00.000000000',
       '2006-01-07T12:00:00.000000000', '2006-01-08T12:00:00.000000000',
       '2006-01-09T12:00:00.000000000', '2006-01-10T12:00:00.000000000',
       '2006-01-11T12:00:00.000000000', '2006-01-12T12:00:00.000000000',
       '2006-01-13T12:00:00.000000000', '2006-01-14T12:00:00.000000000',
       '2006-01-15T12:00:00.000000000', '2006-01-16T12:00:00.000000000',
       '2006-01-17T12:00:00.000000000', '2006-01-18T12:00:00.000000000',
       '2006-01-19T12:00:00.000000000', '2006-01-20T12:00:00.000000000',
       '2006-01-21T12:00:00.000000000', '2006-01-22T12:00:00.000000000',
       '2006-01-23T12:00:00.000000000', '2006-01-24T12:00:00.000000000',
       '2006-01-25T12:00:00.000000000', '2006-01-26T12:00:00.000000000',
       '2006-01-27T12:00:00.000000000', '2006-01-28T12:00:00.000000000',
       '2006-01-29T12:00:00.000000000', '2006-01-30T12:00:00.000000000',
       '2006-01-31T12:00:00.000000000', '2006-02-01T12:00:00.000000000'],
      dtype='datetime64[ns]')
Coordinates:
  * time     (time) datetime64[ns] 2006-01-01T12:00:00 2006-01-02T12:00:00 ...
Attributes:
    standard_name:  time
    axis:           T
    comment:        
    bounds:         time_bnds
    long_name:      reference time of sst file
    _ChunkSizes:    1
```

#### Output of ``xr.show_versions()``

<details>
INSTALLED VERSIONS
------------------
commit: None
python: 3.6.4.final.0
python-bits: 32
OS: Windows
OS-release: 10
machine: AMD64
processor: Intel64 Family 6 Model 69 Stepping 1, GenuineIntel
byteorder: little
LC_ALL: None
LANG: None
LOCALE: None.None

xarray: 0.10.1
pandas: 0.22.0
numpy: 1.14.2
scipy: 0.19.1
netCDF4: 1.3.1
h5netcdf: 0.5.0
h5py: 2.7.1
Nio: None
zarr: None
bottleneck: 1.2.1
cyordereddict: None
dask: 0.17.1
distributed: 1.21.3
matplotlib: 2.2.2
cartopy: 0.16.0
seaborn: None
setuptools: 39.0.1
pip: 9.0.2
conda: None
pytest: 3.1.3
IPython: 6.2.1
sphinx: None

</details>



Discussion:
#1859 seems to be related.
Actual data can be retrieved from here:
ftp://anon-ftp.ceda.ac.uk/neodc/esacci/sst/data/lt/Analysis/L4/v01.1
I think it is related to #1932.
Can you try xarray=0.10.2?
Thanks for looking into this!

I did try 0.10.2, same result as 0.10.1.
Could you try investigating minimal working example?
I tried with two of your examples, but the issue is not reproduced
```python
In [9]: ds = xr.open_mfdataset(['Desktop/19910901120000-ESACCI-L4_GHRSST-SSTdepth-OSTIA-GLOB_LT-v02.0-fv01.1.nc', 'Desktop/19910902120000-ESACCI-L4_GHRSST-SSTdepth-OSTIA-GLOB_LT-v02.0-fv01.1.nc'], decode_cf=True)
In [11]: ds['time']
Out[11]: 
<xarray.DataArray 'time' (time: 2)>
array(['1981-01-01T00:00:00.564166656', '1980-12-31T23:59:58.707073024'],
      dtype='datetime64[ns]')
Coordinates:
  * time     (time) datetime64[ns] 1981-01-01T00:00:00.564166656 ...
Attributes:
    standard_name:  time
    axis:           T
    bounds:         time_bnds
    comment:        
    long_name:      reference time of sst file
```
You have just reproduced the issue.

The correct datetime values are in the filenames. So, you open two files, one from ``1991-09-01T12:00:00.00`` and the other from ``1991-09-02T12:00:00.00``, but the decoded time dimension becomes:
```
array(['1981-01-01T00:00:00.564166656', '1980-12-31T23:59:58.707073024'], dtype='datetime64[ns]')
```

Which is exactly the problem I'm facing.
Oh, thanks. I misunderstood the problem.
Related to #1803? but I did not follow that well.
Can anyone look into this issue?
The minimal working example would be
1 download from one file from [here](http://anon-ftp.ceda.ac.uk/neodc/esacci/sst/data/lt/Analysis/L4/v01.1/1991/09/02/19910902120000-ESACCI-L4_GHRSST-SSTdepth-OSTIA-GLOB_LT-v02.0-fv01.1.nc)
2 Load and see `xr.open_dataset(path/to/file)['time']`
3 compare with `netCDF4.Dataset(path/to/file)['time']`
The problem comes from the fact that the times in the files are stored in int32. This mwe reproduces the error:

```python
import xarray as xr
import numpy as np
ds = xr.Dataset()
ds['time'] = xr.DataArray([np.int32(788961600)], dims=['time'])
ds['time'].attrs['units'] = 'seconds since 1981-01-01'
xr.decode_cf(ds)['time']
```

This is due to https://github.com/pydata/xarray/pull/1414/, I'm looking into it




Patch:
diff --git a/doc/whats-new.rst b/doc/whats-new.rst
index b28beb9e3b2..87b019b54aa 100644
--- a/doc/whats-new.rst
+++ b/doc/whats-new.rst
@@ -47,6 +47,9 @@ Bug fixes
 - Fixed labeled indexing with slice bounds given by xarray objects with
   datetime64 or timedelta64 dtypes (:issue:`1240`).
   By `Stephan Hoyer <https://github.com/shoyer>`_.
+- Fixed a bug in decode_cf_datetime where ``int32`` arrays weren't parsed
+  correctly (:issue:`2002`).
+  By `Fabien Maussion <https://github.com/fmaussion>`_.
 
 .. _whats-new.0.10.2:
 
diff --git a/xarray/coding/times.py b/xarray/coding/times.py
index 1bb4e31ae7e..8a1e9f82c6c 100644
--- a/xarray/coding/times.py
+++ b/xarray/coding/times.py
@@ -166,7 +166,8 @@ def decode_cf_datetime(num_dates, units, calendar=None):
 
         # Cast input dates to integers of nanoseconds because `pd.to_datetime`
         # works much faster when dealing with integers
-        flat_num_dates_ns_int = (flat_num_dates *
+        # make _NS_PER_TIME_DELTA an array to ensure type upcasting
+        flat_num_dates_ns_int = (flat_num_dates.astype(np.float64) *
                                  _NS_PER_TIME_DELTA[delta]).astype(np.int64)
 
         dates = (pd.to_timedelta(flat_num_dates_ns_int, 'ns') +


Test patch:
diff --git a/xarray/tests/test_coding_times.py b/xarray/tests/test_coding_times.py
index b85f92ece66..ab33329b51a 100644
--- a/xarray/tests/test_coding_times.py
+++ b/xarray/tests/test_coding_times.py
@@ -49,6 +49,7 @@ def test_cf_datetime(self):
             ([0.5, 1.5], 'hours since 1900-01-01T00:00:00'),
             (0, 'milliseconds since 2000-01-01T00:00:00'),
             (0, 'microseconds since 2000-01-01T00:00:00'),
+            (np.int32(788961600), 'seconds since 1981-01-01'),  # GH2002
         ]:
             for calendar in ['standard', 'gregorian', 'proleptic_gregorian']:
                 expected = _ensure_naive_tz(