Skip to content

Commit a97396b

Browse files
authored
BUG: DTA.isin with mismatched resos (#49050)
* BUG: DTA.isin with mismatched resos * mypy fixup * xfail list case
1 parent 98323ee commit a97396b

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

pandas/core/arrays/datetimelike.py

+4
Original file line numberDiff line numberDiff line change
@@ -866,6 +866,10 @@ def isin(self, values) -> npt.NDArray[np.bool_]:
866866
except ValueError:
867867
return isin(self.astype(object), values)
868868

869+
if self.dtype.kind in ["m", "M"]:
870+
self = cast("DatetimeArray | TimedeltaArray", self)
871+
values = values._as_unit(self._unit)
872+
869873
try:
870874
self._check_compatible_with(values)
871875
except (TypeError, ValueError):

pandas/tests/series/methods/test_isin.py

+27-4
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,33 @@ def test_isin_with_string_scalar(self):
4343
with pytest.raises(TypeError, match=msg):
4444
s.isin("aaa")
4545

46+
def test_isin_datetimelike_mismatched_reso(self):
47+
expected = Series([True, True, False, False, False])
48+
49+
ser = Series(date_range("jan-01-2013", "jan-05-2013"))
50+
51+
# fails on dtype conversion in the first place
52+
day_values = np.asarray(ser[0:2].values).astype("datetime64[D]")
53+
result = ser.isin(day_values)
54+
tm.assert_series_equal(result, expected)
55+
56+
dta = ser[:2]._values.astype("M8[s]")
57+
result = ser.isin(dta)
58+
tm.assert_series_equal(result, expected)
59+
60+
@pytest.mark.xfail(
61+
reason="DTA._from_sequence incorrectly treats Timestamp[s].value as "
62+
"nanoseconds."
63+
)
64+
def test_isin_datetimelike_mismatched_reso_list(self):
65+
expected = Series([True, True, False, False, False])
66+
67+
ser = Series(date_range("jan-01-2013", "jan-05-2013"))
68+
69+
dta = ser[:2]._values.astype("M8[s]")
70+
result = ser.isin(list(dta))
71+
tm.assert_series_equal(result, expected)
72+
4673
def test_isin_with_i8(self):
4774
# GH#5021
4875

@@ -58,10 +85,6 @@ def test_isin_with_i8(self):
5885
result = s.isin(s[0:2].values)
5986
tm.assert_series_equal(result, expected)
6087

61-
# fails on dtype conversion in the first place
62-
result = s.isin(np.asarray(s[0:2].values).astype("datetime64[D]"))
63-
tm.assert_series_equal(result, expected)
64-
6588
result = s.isin([s[1]])
6689
tm.assert_series_equal(result, expected2)
6790

0 commit comments

Comments
 (0)