From cedb6746835f235738c43070151370af3f0f6409 Mon Sep 17 00:00:00 2001 From: Patrick Hoefler Date: Wed, 27 Dec 2023 22:34:18 +0100 Subject: [PATCH 1/2] BUG: Series.to_numpy raising for arrow floats to numpy floats --- pandas/core/arrays/arrow/array.py | 6 +++++- pandas/tests/extension/test_arrow.py | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index 23b5448029dd9..06306d3dc7e27 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -1320,6 +1320,7 @@ def to_numpy( copy: bool = False, na_value: object = lib.no_default, ) -> np.ndarray: + original_na_value = na_value dtype, na_value = to_numpy_dtype_inference(self, dtype, na_value, self._hasna) pa_type = self._pa_array.type if not self._hasna or isna(na_value) or pa.types.is_null(pa_type): @@ -1345,7 +1346,10 @@ def to_numpy( if dtype is not None and isna(na_value): na_value = None result = np.full(len(data), fill_value=na_value, dtype=dtype) - elif not data._hasna or (pa.types.is_floating(pa_type) and na_value is np.nan): + elif not data._hasna or ( + pa.types.is_floating(pa_type) + and (na_value is np.nan or original_na_value is lib.no_default) + ): result = data._pa_array.to_numpy() if dtype is not None: result = result.astype(dtype, copy=False) diff --git a/pandas/tests/extension/test_arrow.py b/pandas/tests/extension/test_arrow.py index 3b03272f18203..5624acfb64764 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -3153,6 +3153,14 @@ def test_string_to_time_parsing_cast(): tm.assert_series_equal(result, expected) +def test_to_numpy_float(): + # GH#56267 + ser = pd.Series([32, 40, None], dtype="float[pyarrow]") + result = ser.astype("float64") + expected = pd.Series([32, 40, np.nan], dtype="float64") + 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]") From 0d3b59b2fd07a5b35eeeecd84f9d92556c54ff0b Mon Sep 17 00:00:00 2001 From: Patrick Hoefler Date: Wed, 27 Dec 2023 23:28:31 +0100 Subject: [PATCH 2/2] Fixup --- pandas/core/arrays/arrow/array.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index 06306d3dc7e27..de1ed9ecfdaf1 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -37,6 +37,7 @@ CategoricalDtype, is_array_like, is_bool_dtype, + is_float_dtype, is_integer, is_list_like, is_numeric_dtype, @@ -1348,7 +1349,11 @@ def to_numpy( result = np.full(len(data), fill_value=na_value, dtype=dtype) elif not data._hasna or ( pa.types.is_floating(pa_type) - and (na_value is np.nan or original_na_value is lib.no_default) + and ( + na_value is np.nan + or original_na_value is lib.no_default + and is_float_dtype(dtype) + ) ): result = data._pa_array.to_numpy() if dtype is not None: