diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index fbd7626c8637d..e9122544a18f5 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -1958,6 +1958,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 91a96c8154779..f0edec1eba6a3 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -2261,6 +2261,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],