From b09aa83b6c744ab70c597115dad6dd2dabf881dd Mon Sep 17 00:00:00 2001 From: Matthew Roeschke <10647082+mroeschke@users.noreply.github.com> Date: Tue, 19 Dec 2023 11:11:21 -0800 Subject: [PATCH 1/3] BUG: ArrowExtensionArray.to_numpy from timestamp to int --- pandas/core/arrays/arrow/array.py | 16 ++++++---------- pandas/tests/extension/test_arrow.py | 8 ++++++++ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index 84d6e2fb7ca53..ed51d5e043f79 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -1313,16 +1313,12 @@ def to_numpy( copy = False if pa.types.is_timestamp(pa_type) or pa.types.is_duration(pa_type): - result = data._maybe_convert_datelike_array() - if (pa.types.is_timestamp(pa_type) and pa_type.tz is not None) or ( - dtype is not None and dtype.kind == "O" - ): - dtype = object - else: - # GH 55997 - dtype = None - na_value = pa_type.to_pandas_dtype().type("nat", pa_type.unit) - result = result.to_numpy(dtype=dtype, na_value=na_value) + # GH 55997 + if na_value is self.dtype.na_value: + na_value = lib.no_default + result = data._maybe_convert_datelike_array().to_numpy( + dtype=dtype, na_value=na_value + ) elif pa.types.is_time(pa_type) or pa.types.is_date(pa_type): # convert to list of python datetime.time objects before # wrapping in ndarray diff --git a/pandas/tests/extension/test_arrow.py b/pandas/tests/extension/test_arrow.py index 4835cb11db042..566afe94459fb 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -3108,3 +3108,11 @@ def test_string_to_time_parsing_cast(): ArrowExtensionArray(pa.array([time(11, 41, 43, 76160)], from_pandas=True)) ) tm.assert_series_equal(result, expected) + + +def test_to_numpy_timestamp_to_int(): + # GH 55997 + ser = pd.Series(["2020-01-01 04:30:00"], dtype="timestamp[ns][pyarrow]") + result = ser.to_numpy(dtype=np.int64) + expected = np.array([1577853000000000000]) + tm.assert_numpy_array_equal(result, expected) From 7669844be286d438bfdd6e4310c2001885f8fdc7 Mon Sep 17 00:00:00 2001 From: Matthew Roeschke <10647082+mroeschke@users.noreply.github.com> Date: Tue, 19 Dec 2023 12:02:11 -0800 Subject: [PATCH 2/3] Include check for object --- pandas/core/arrays/arrow/array.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index ed51d5e043f79..2013229b228ff 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -1314,7 +1314,7 @@ def to_numpy( if pa.types.is_timestamp(pa_type) or pa.types.is_duration(pa_type): # GH 55997 - if na_value is self.dtype.na_value: + if dtype != object and na_value is self.dtype.na_value: na_value = lib.no_default result = data._maybe_convert_datelike_array().to_numpy( dtype=dtype, na_value=na_value From f8d9454401d6b4ac269fc9e17290020fe820d8c3 Mon Sep 17 00:00:00 2001 From: Matthew Roeschke <10647082+mroeschke@users.noreply.github.com> Date: Tue, 19 Dec 2023 13:24:00 -0800 Subject: [PATCH 3/3] Adjust test --- pandas/tests/extension/test_arrow.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pandas/tests/extension/test_arrow.py b/pandas/tests/extension/test_arrow.py index 566afe94459fb..6026da8d7ba28 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -2996,7 +2996,10 @@ def test_to_numpy_temporal(pa_type, dtype): value = pd.Timestamp(1, unit=pa_type.unit, tz=pa_type.tz).as_unit(pa_type.unit) if dtype == object or (pa.types.is_timestamp(pa_type) and pa_type.tz is not None): - na = pd.NA + if dtype == object: + na = pd.NA + else: + na = pd.NaT expected = np.array([value, na], dtype=object) assert result[0].unit == value.unit else: