diff --git a/doc/source/whatsnew/v0.23.0.txt b/doc/source/whatsnew/v0.23.0.txt index cfe28edd175b6..eda3fba043be9 100644 --- a/doc/source/whatsnew/v0.23.0.txt +++ b/doc/source/whatsnew/v0.23.0.txt @@ -887,7 +887,8 @@ Timedelta - Bug in :func:`Timedelta.total_seconds()` causing precision errors i.e. ``Timedelta('30S').total_seconds()==30.000000000000004`` (:issue:`19458`) - Bug in :func: `Timedelta.__rmod__` where operating with a ``numpy.timedelta64`` returned a ``timedelta64`` object instead of a ``Timedelta`` (:issue:`19820`) - Multiplication of :class:`TimedeltaIndex` by ``TimedeltaIndex`` will now raise ``TypeError`` instead of raising ``ValueError`` in cases of length mis-match (:issue`19333`) -- +- Bug in indexing a :class:`TimedeltaIndex` with a ``np.timedelta64`` object which was raising a ``TypeError`` (:issue:`20393`) + Timezones ^^^^^^^^^ diff --git a/pandas/core/indexes/timedeltas.py b/pandas/core/indexes/timedeltas.py index b5a08fc0168e4..9757d775201cc 100644 --- a/pandas/core/indexes/timedeltas.py +++ b/pandas/core/indexes/timedeltas.py @@ -829,7 +829,8 @@ def _maybe_cast_slice_bound(self, label, side, kind): else: return (lbound + to_offset(parsed.resolution) - Timedelta(1, 'ns')) - elif is_integer(label) or is_float(label): + elif ((is_integer(label) or is_float(label)) and + not is_timedelta64_dtype(label)): self._invalid_indexer('slice', label) return label diff --git a/pandas/tests/indexing/test_timedelta.py b/pandas/tests/indexing/test_timedelta.py index 3ad3b771b2ab2..48ea49119356d 100644 --- a/pandas/tests/indexing/test_timedelta.py +++ b/pandas/tests/indexing/test_timedelta.py @@ -68,3 +68,15 @@ def test_listlike_setitem(self, value): series.iloc[0] = value expected = pd.Series([pd.NaT, 1, 2], dtype='timedelta64[ns]') tm.assert_series_equal(series, expected) + + @pytest.mark.parametrize('start,stop, expected_slice', [ + [np.timedelta64(0, 'ns'), None, slice(0, 11)], + [np.timedelta64(1, 'D'), np.timedelta64(6, 'D'), slice(1, 7)], + [None, np.timedelta64(4, 'D'), slice(0, 5)]]) + def test_numpy_timedelta_scalar_indexing(self, start, stop, + expected_slice): + # GH 20393 + s = pd.Series(range(11), pd.timedelta_range('0 days', '10 days')) + result = s.loc[slice(start, stop)] + expected = s.iloc[expected_slice] + tm.assert_series_equal(result, expected)