pydata / pydata/xarray

Indexing a datetime64[ns] coordinate with a scalar datetime.date produces a KeyError

Open
#4,363 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

upstream issue
Dominant language
Python
Stars
4.2k
Forks
1.4k
Avg merge
2d 15h
Merged PRs (30d)
14

Description

Indexing a datetime64[ns] coordinate with a scalar datetime.date produces a KeyError ([6]).
Curiously, indexing with a datetime.date slice does work ([5]).
I would expect [6] to work just like [4].

This may well be related to (or a duplicate of) #3736, #4283, #4292, #4306, #4319, or #4370, but none of those actually mentions datetime.date objects, so I can't tell.

In [1]: import xarray as xr, pandas as pd, datetime as dt

In [2]: x = xr.DataArray([1., 2., 3.], [('foo', pd.date_range('2010-01-01', periods=3))])

In [3]: x
Out[3]: 
<xarray.DataArray (foo: 3)>
array([1., 2., 3.])
Coordinates:
  * foo      (foo) datetime64[ns] 2010-01-01 2010-01-02 2010-01-03

In [4]: x.loc[dt.datetime(2010, 1, 1)]
Out[4]: 
<xarray.DataArray ()>
array(1.)
Coordinates:
    foo      datetime64[ns] 2010-01-01

In [5]: x.loc[dt.date(2010, 1, 1):dt.date(2010, 1, 3)]
Out[5]: 
<xarray.DataArray (foo: 3)>
array([1., 2., 3.])
Coordinates:
  * foo      (foo) datetime64[ns] 2010-01-01 2010-01-02 2010-01-03

In [6]: x.loc[dt.date(2010, 1, 1)]
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-5-8ef314626f7d> in <module>
----> 1 x.loc[dt.date(2010, 1, 1)]

~/.conda/envs/build/lib/python3.7/site-packages/xarray/core/dataarray.py in __getitem__(self, key)
    196             labels = indexing.expanded_indexer(key, self.data_array.ndim)
    197             key = dict(zip(self.data_array.dims, labels))
--> 198         return self.data_array.sel(**key)
    199 
    200     def __setitem__(self, key, value) -> None:

~/.conda/envs/build/lib/python3.7/site-packages/xarray/core/dataarray.py in sel(self, indexers, method, tolerance, drop, **indexers_kwargs)
   1152             method=method,
   1153             tolerance=tolerance,
-> 1154             **indexers_kwargs,
   1155         )
   1156         return self._from_temp_dataset(ds)

~/.conda/envs/build/lib/python3.7/site-packages/xarray/core/dataset.py in sel(self, indexers, method, tolerance, drop, **indexers_kwargs)
   2100         indexers = either_dict_or_kwargs(indexers, indexers_kwargs, "sel")
   2101         pos_indexers, new_indexes = remap_label_indexers(
-> 2102             self, indexers=indexers, method=method, tolerance=tolerance
   2103         )
   2104         result = self.isel(indexers=pos_indexers, drop=drop)

~/.conda/envs/build/lib/python3.7/site-packages/xarray/core/coordinates.py in remap_label_indexers(obj, indexers, method, tolerance, **indexers_kwargs)
    395 
    396     pos_indexers, new_indexes = indexing.remap_label_indexers(
--> 397         obj, v_indexers, method=method, tolerance=tolerance
    398     )
    399     # attach indexer's coordinate to pos_indexers

~/.conda/envs/build/lib/python3.7/site-packages/xarray/core/indexing.py in remap_label_indexers(data_obj, indexers, method, tolerance)
    268             coords_dtype = data_obj.coords[dim].dtype
    269             label = maybe_cast_to_coords_dtype(label, coords_dtype)
--> 270             idxr, new_idx = convert_label_indexer(index, label, dim, method, tolerance)
    271             pos_indexers[dim] = idxr
    272             if new_idx is not None:

~/.conda/envs/build/lib/python3.7/site-packages/xarray/core/indexing.py in convert_label_indexer(index, label, index_name, method, tolerance)
    188             else:
    189                 indexer = index.get_loc(
--> 190                     label.item(), method=method, tolerance=tolerance
    191                 )
    192         elif label.dtype.kind == "b":

~/.conda/envs/build/lib/python3.7/site-packages/pandas/core/indexes/datetimes.py in get_loc(self, key, method, tolerance)
    620         else:
    621             # unrecognized type
--> 622             raise KeyError(key)
    623 
    624         try:

KeyError: datetime.date(2010, 1, 1)

Environment:

Output of xr.show_versions()

INSTALLED VERSIONS

commit: None
python: 3.7.8 | packaged by conda-forge | (default, Jul 31 2020, 02:25:08)
[GCC 7.5.0]
python-bits: 64
OS: Linux
OS-release: 3.10.0-693.el7.x86_64
machine: x86_64
processor: x86_64
byteorder: little
LC_ALL: None
LANG: en_US.UTF-8
LOCALE: en_US.UTF-8
libhdf5: 1.10.6
libnetcdf: 4.7.4

xarray: 0.16.0
pandas: 1.1.0
numpy: 1.19.1
scipy: 1.5.2
netCDF4: 1.5.4
pydap: None
h5netcdf: 0.8.1
h5py: 2.10.0
Nio: None
zarr: None
cftime: 1.2.1
nc_time_axis: None
PseudoNetCDF: None
rasterio: None
cfgrib: None
iris: None
bottleneck: 1.3.2
dask: 2.23.0
distributed: 2.23.0
matplotlib: 3.3.1
cartopy: None
seaborn: 0.10.1
numbagg: installed
pint: None
setuptools: 49.6.0.post20200814
pip: 20.2.2
conda: 4.8.4
pytest: None
IPython: 7.17.0
sphinx: None

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the scalar datetime.date failure with the example in the issue, then inspect the label-conversion path shown in xarray/core/indexing.py, especially convert_label_indexer. Add regression coverage showing that scalar datetime.date selection works consistently with datetime selection and date slicing.

Written by the indexing model from the issue text.

Assessment

Tech stack
pandas, python
Domain
data
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.