diff --git a/pandas/core/algorithms.py b/pandas/core/algorithms.py index 14dee202a9d8d..549a5144a4053 100644 --- a/pandas/core/algorithms.py +++ b/pandas/core/algorithms.py @@ -73,6 +73,7 @@ na_value_for_dtype, ) +from pandas.core.api import PeriodDtype from pandas.core.array_algos.take import take_nd from pandas.core.construction import ( array as pd_array, @@ -501,6 +502,8 @@ def isin(comps: ListLike, values: ListLike) -> npt.NDArray[np.bool_]: comps_array = extract_array(comps_array, extract_numpy=True) if not isinstance(comps_array, np.ndarray): # i.e. Extension Array + if isinstance(comps_array.dtype, PeriodDtype): + comps_array = comps_array.to_timestamp() return comps_array.isin(values) elif needs_i8_conversion(comps_array.dtype): diff --git a/pandas/tests/arrays/categorical/test_algos.py b/pandas/tests/arrays/categorical/test_algos.py index d4c19a4970135..ac4025a1a1a92 100644 --- a/pandas/tests/arrays/categorical/test_algos.py +++ b/pandas/tests/arrays/categorical/test_algos.py @@ -77,6 +77,22 @@ def test_isin_empty(empty): tm.assert_numpy_array_equal(expected, result) +def test_isin_period_range(): + period_range = pd.period_range("2000-01-01", periods=3) + element = ["2000-01-02"] + result = period_range.isin(element) + expected = np.array([False, True, False], dtype=bool) + tm.assert_numpy_array_equal(expected, result) + + +def test_isin_date_dtype(): + period_range = pd.date_range("2000-01-01", periods=3) + element = ["2000-01-02"] + result = period_range.isin(element) + expected = np.array([False, True, False], dtype=bool) + tm.assert_numpy_array_equal(expected, result) + + def test_diff(): ser = pd.Series([1, 2, 3], dtype="category") diff --git a/pandas/tests/frame/test_query_eval.py b/pandas/tests/frame/test_query_eval.py index 72e8236159bda..b12f883aac74b 100644 --- a/pandas/tests/frame/test_query_eval.py +++ b/pandas/tests/frame/test_query_eval.py @@ -16,6 +16,7 @@ MultiIndex, Series, date_range, + period_range, ) import pandas._testing as tm from pandas.core.computation.check import NUMEXPR_INSTALLED @@ -1404,3 +1405,21 @@ def test_query_ea_equality_comparison(self, dtype, engine): } ) tm.assert_frame_equal(result, expected) + + +class TestPeriodDtypeQueryPythonPandas(TestDataFrameQueryNumExprPandas): + @pytest.fixture + def engine(self): + return "python" + + @pytest.fixture + def parser(self): + return "pandas" + + def test_query_builtin(self, engine, parser): + df = DataFrame( + {"Date": period_range("2000-01-01", periods=10, name="Date")}, + ) + result = df.query("Date == '2000-01-06'", parser=parser, engine=engine) + expected = DataFrame([{"Date": pd.Period("2000-01-06", "D")}], index=[5]) + tm.assert_frame_equal(result, expected)