diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index 410995d8dec53..7e4ce970d1b9c 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -866,6 +866,10 @@ def isin(self, values) -> npt.NDArray[np.bool_]: except ValueError: return isin(self.astype(object), values) + if self.dtype.kind in ["m", "M"]: + self = cast("DatetimeArray | TimedeltaArray", self) + values = values._as_unit(self._unit) + try: self._check_compatible_with(values) except (TypeError, ValueError): diff --git a/pandas/tests/series/methods/test_isin.py b/pandas/tests/series/methods/test_isin.py index 2288dfb5c2409..0eca3e0512849 100644 --- a/pandas/tests/series/methods/test_isin.py +++ b/pandas/tests/series/methods/test_isin.py @@ -43,6 +43,33 @@ def test_isin_with_string_scalar(self): with pytest.raises(TypeError, match=msg): s.isin("aaa") + def test_isin_datetimelike_mismatched_reso(self): + expected = Series([True, True, False, False, False]) + + ser = Series(date_range("jan-01-2013", "jan-05-2013")) + + # fails on dtype conversion in the first place + day_values = np.asarray(ser[0:2].values).astype("datetime64[D]") + result = ser.isin(day_values) + tm.assert_series_equal(result, expected) + + dta = ser[:2]._values.astype("M8[s]") + result = ser.isin(dta) + tm.assert_series_equal(result, expected) + + @pytest.mark.xfail( + reason="DTA._from_sequence incorrectly treats Timestamp[s].value as " + "nanoseconds." + ) + def test_isin_datetimelike_mismatched_reso_list(self): + expected = Series([True, True, False, False, False]) + + ser = Series(date_range("jan-01-2013", "jan-05-2013")) + + dta = ser[:2]._values.astype("M8[s]") + result = ser.isin(list(dta)) + tm.assert_series_equal(result, expected) + def test_isin_with_i8(self): # GH#5021 @@ -58,10 +85,6 @@ def test_isin_with_i8(self): result = s.isin(s[0:2].values) tm.assert_series_equal(result, expected) - # fails on dtype conversion in the first place - result = s.isin(np.asarray(s[0:2].values).astype("datetime64[D]")) - tm.assert_series_equal(result, expected) - result = s.isin([s[1]]) tm.assert_series_equal(result, expected2)