diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index d8b0b53331229..6084634503d97 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -2090,6 +2090,9 @@ def _dt_round( ): return self._round_temporally("round", freq, ambiguous, nonexistent) + def _dt_to_pydatetime(self): + return np.array(self._data.to_pylist(), dtype=object) + def _dt_tz_localize( self, tz, diff --git a/pandas/core/indexes/accessors.py b/pandas/core/indexes/accessors.py index 788448f2c7be6..236449881dc41 100644 --- a/pandas/core/indexes/accessors.py +++ b/pandas/core/indexes/accessors.py @@ -209,6 +209,9 @@ def _delegate_method(self, name: str, *args, **kwargs): return result + def to_pydatetime(self): + return cast(ArrowExtensionArray, self._parent.array)._dt_to_pydatetime() + def isocalendar(self): from pandas import DataFrame diff --git a/pandas/tests/extension/test_arrow.py b/pandas/tests/extension/test_arrow.py index 712fccae83cfe..6a3c49c826536 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -2248,6 +2248,19 @@ def test_dt_ceil_year_floor(freq, method): tm.assert_series_equal(result, expected) +def test_dt_to_pydatetime(): + # GH 51859 + data = [datetime(2022, 1, 1), datetime(2023, 1, 1)] + ser = pd.Series(data, dtype=ArrowDtype(pa.timestamp("ns"))) + + result = ser.dt.to_pydatetime() + expected = np.array(data, dtype=object) + tm.assert_numpy_array_equal(result, expected) + + expected = ser.astype("datetime64[ns]").dt.to_pydatetime() + tm.assert_numpy_array_equal(result, expected) + + def test_dt_tz_localize_unsupported_tz_options(): ser = pd.Series( [datetime(year=2023, month=1, day=2, hour=3), None],