From dadb51c8d6384aef5758732b0e5c26b7c135169e Mon Sep 17 00:00:00 2001 From: Matthew Roeschke <10647082+mroeschke@users.noreply.github.com> Date: Thu, 9 Mar 2023 11:34:52 -0800 Subject: [PATCH] ENH: Add to_pydatetime for ArrowExtensionArray --- pandas/core/arrays/arrow/array.py | 3 +++ pandas/core/indexes/accessors.py | 3 +++ pandas/tests/extension/test_arrow.py | 13 +++++++++++++ 3 files changed, 19 insertions(+) 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],