diff --git a/xarray/core/indexing.py b/xarray/core/indexing.py index 28ed2cfb16f..3ea4dfe1244 100644 --- a/xarray/core/indexing.py +++ b/xarray/core/indexing.py @@ -173,8 +173,9 @@ def convert_label_indexer(index, label, index_name="", method=None, tolerance=No else _asarray_tuplesafe(label) ) if label.ndim == 0: + label_value = label[()] if isinstance(index, pd.MultiIndex): - indexer, new_index = index.get_loc_level(label.item(), level=0) + indexer, new_index = index.get_loc_level(label_value, level=0) elif isinstance(index, pd.CategoricalIndex): if method is not None: raise ValueError( @@ -184,10 +185,10 @@ def convert_label_indexer(index, label, index_name="", method=None, tolerance=No raise ValueError( "'tolerance' is not a valid kwarg when indexing using a CategoricalIndex." ) - indexer = index.get_loc(label.item()) + indexer = index.get_loc(label_value) else: indexer = index.get_loc( - label.item(), method=method, tolerance=tolerance + label_value, method=method, tolerance=tolerance ) elif label.dtype.kind == "b": indexer = label diff --git a/xarray/tests/test_dataarray.py b/xarray/tests/test_dataarray.py index e0da3f1527f..c40fc1c3896 100644 --- a/xarray/tests/test_dataarray.py +++ b/xarray/tests/test_dataarray.py @@ -938,7 +938,7 @@ def test_sel_invalid_slice(self): with raises_regex(ValueError, "cannot use non-scalar arrays"): array.sel(x=slice(array.x)) - def test_sel_dataarray_datetime(self): + def test_sel_dataarray_datetime_slice(self): # regression test for GH1240 times = pd.date_range("2000-01-01", freq="D", periods=365) array = DataArray(np.arange(365), [("time", times)]) @@ -1078,6 +1078,12 @@ def test_loc(self): assert_identical(da[:3, :4], da.loc[["a", "b", "c"], np.arange(4)]) assert_identical(da[:, :4], da.loc[:, self.ds["y"] < 4]) + def test_loc_datetime64_value(self): + # regression test for https://github.com/pydata/xarray/issues/4283 + t = np.array(["2017-09-05T12", "2017-09-05T15"], dtype="datetime64[ns]") + array = DataArray(np.ones(t.shape), dims=("time",), coords=(t,)) + assert_identical(array.loc[{"time": t[0]}], array[0]) + def test_loc_assign(self): self.ds["x"] = ("x", np.array(list("abcdefghij"))) da = self.ds["foo"] diff --git a/xarray/tests/test_indexing.py b/xarray/tests/test_indexing.py index d7ed16b9573..a9d5ac4c5b9 100644 --- a/xarray/tests/test_indexing.py +++ b/xarray/tests/test_indexing.py @@ -7,7 +7,13 @@ from xarray import DataArray, Dataset, Variable from xarray.core import indexing, nputils -from . import IndexerMaker, ReturnItem, assert_array_equal, raises_regex +from . import ( + IndexerMaker, + ReturnItem, + assert_array_equal, + assert_identical, + raises_regex, +) B = IndexerMaker(indexing.BasicIndexer)