From 78b92c4ef03d6be0bfa8b46d69fb9c3c60c55e69 Mon Sep 17 00:00:00 2001 From: KevsterAmp Date: Fri, 13 Jun 2025 17:22:08 +0800 Subject: [PATCH 1/8] call self.to_numpy() when self.dtype.pyarrow_dtype is datelike --- pandas/core/arrays/arrow/array.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index 0b90bcea35100..76b6bd01fc24f 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -1480,6 +1480,10 @@ def to_numpy( def map(self, mapper, na_action: Literal["ignore"] | None = None): if is_numeric_dtype(self.dtype): return map_array(self.to_numpy(), mapper, na_action=na_action) + elif pa.types.is_date(self.dtype.pyarrow_dtype) or pa.types.is_timestamp( + self.dtype.pyarrow_dtype + ): + return map_array(self.to_numpy(), mapper, na_action=na_action) else: return super().map(mapper, na_action) From ffb2a6f358fcb94d1922367756502947e4dab685 Mon Sep 17 00:00:00 2001 From: KevsterAmp Date: Fri, 13 Jun 2025 17:25:05 +0800 Subject: [PATCH 2/8] refactor to combine in one if block --- pandas/core/arrays/arrow/array.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index 76b6bd01fc24f..ecd3fdb4dc8bc 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -1478,10 +1478,10 @@ def to_numpy( return result def map(self, mapper, na_action: Literal["ignore"] | None = None): - if is_numeric_dtype(self.dtype): - return map_array(self.to_numpy(), mapper, na_action=na_action) - elif pa.types.is_date(self.dtype.pyarrow_dtype) or pa.types.is_timestamp( - self.dtype.pyarrow_dtype + if ( + is_numeric_dtype(self.dtype) + or pa.types.is_date(self.dtype.pyarrow_dtype) + or pa.types.is_timestamp(self.dtype.pyarrow_dtype) ): return map_array(self.to_numpy(), mapper, na_action=na_action) else: From bd1b70ccb2c7c55262543f37cffba75d71b1b1bb Mon Sep 17 00:00:00 2001 From: KevsterAmp Date: Thu, 26 Jun 2025 16:43:10 +0800 Subject: [PATCH 3/8] fix stringdtype issue --- pandas/core/arrays/arrow/array.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index ecd3fdb4dc8bc..8f6f0c17a484c 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -1478,10 +1478,12 @@ def to_numpy( return result def map(self, mapper, na_action: Literal["ignore"] | None = None): - if ( - is_numeric_dtype(self.dtype) - or pa.types.is_date(self.dtype.pyarrow_dtype) - or pa.types.is_timestamp(self.dtype.pyarrow_dtype) + if not is_string_dtype(self.dtype) and any( + [ + is_numeric_dtype(self.dtype) + or pa.types.is_date(self.dtype.pyarrow_dtype) + or pa.types.is_timestamp(self.dtype.pyarrow_dtype) + ] ): return map_array(self.to_numpy(), mapper, na_action=na_action) else: From 38f375ac323b4ff78fbd38d22a2abd2cd537ed86 Mon Sep 17 00:00:00 2001 From: KevsterAmp Date: Wed, 9 Jul 2025 22:13:14 +0800 Subject: [PATCH 4/8] use self.dtype.kind to filter all datetimelike --- pandas/core/arrays/arrow/array.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index 58b587808de48..09a2f58a45e67 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -1490,16 +1490,9 @@ def to_numpy( return result def map(self, mapper, na_action: Literal["ignore"] | None = None): - if not is_string_dtype(self.dtype) and any( - [ - is_numeric_dtype(self.dtype) - or pa.types.is_date(self.dtype.pyarrow_dtype) - or pa.types.is_timestamp(self.dtype.pyarrow_dtype) - ] - ): + if self.dtype.kind == "mM" or is_numeric_dtype(self.dtype): return map_array(self.to_numpy(), mapper, na_action=na_action) - else: - return super().map(mapper, na_action) + return super().map(mapper, na_action) @doc(ExtensionArray.duplicated) def duplicated( From ecf2d3148f47139d027119d1c0344d8e556d65cc Mon Sep 17 00:00:00 2001 From: KevsterAmp Date: Wed, 9 Jul 2025 22:13:17 +0800 Subject: [PATCH 5/8] fix tests --- pandas/tests/extension/test_arrow.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pandas/tests/extension/test_arrow.py b/pandas/tests/extension/test_arrow.py index 7e7cd8fb13456..21f69b6c913ca 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -65,6 +65,7 @@ is_unsigned_integer_dtype, ) from pandas.tests.extension import base +from pandas.core.algorithms import map_array pa = pytest.importorskip("pyarrow") @@ -278,8 +279,9 @@ def test_compare_scalar(self, data, comparison_op): @pytest.mark.parametrize("na_action", [None, "ignore"]) def test_map(self, data_missing, na_action): if data_missing.dtype.kind in "mM": - result = data_missing.map(lambda x: x, na_action=na_action) - expected = data_missing.to_numpy(dtype=object) + mapper = lambda x: x + result = data_missing.map(mapper, na_action=na_action) + expected = map_array(data_missing.to_numpy(dtype=object), mapper, na_action=na_action) tm.assert_numpy_array_equal(result, expected) else: result = data_missing.map(lambda x: x, na_action=na_action) From ab84b92d4224af328cd630cfb4ba0a433e07ef72 Mon Sep 17 00:00:00 2001 From: KevsterAmp Date: Wed, 9 Jul 2025 22:13:56 +0800 Subject: [PATCH 6/8] fix self.dtype.kind filter --- 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 09a2f58a45e67..382b5cf715c7e 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -1490,7 +1490,7 @@ def to_numpy( return result def map(self, mapper, na_action: Literal["ignore"] | None = None): - if self.dtype.kind == "mM" or is_numeric_dtype(self.dtype): + if self.dtype.kind in "mM" or is_numeric_dtype(self.dtype): return map_array(self.to_numpy(), mapper, na_action=na_action) return super().map(mapper, na_action) From d3d1c1750f7b0bc9068ac9d8d02142a0e321ce2c Mon Sep 17 00:00:00 2001 From: KevsterAmp Date: Wed, 9 Jul 2025 22:19:34 +0800 Subject: [PATCH 7/8] fix precommit --- pandas/tests/extension/test_arrow.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pandas/tests/extension/test_arrow.py b/pandas/tests/extension/test_arrow.py index 21f69b6c913ca..b4964205623c2 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -64,8 +64,8 @@ is_string_dtype, is_unsigned_integer_dtype, ) -from pandas.tests.extension import base from pandas.core.algorithms import map_array +from pandas.tests.extension import base pa = pytest.importorskip("pyarrow") @@ -281,7 +281,9 @@ def test_map(self, data_missing, na_action): if data_missing.dtype.kind in "mM": mapper = lambda x: x result = data_missing.map(mapper, na_action=na_action) - expected = map_array(data_missing.to_numpy(dtype=object), mapper, na_action=na_action) + expected = map_array( + data_missing.to_numpy(dtype=object), mapper, na_action=na_action + ) tm.assert_numpy_array_equal(result, expected) else: result = data_missing.map(lambda x: x, na_action=na_action) From a2e1c34398d2c933e4b076fd0c5c4161cd26a551 Mon Sep 17 00:00:00 2001 From: KevsterAmp Date: Wed, 9 Jul 2025 22:47:50 +0800 Subject: [PATCH 8/8] remove dtype=object to fix tests --- pandas/tests/extension/test_arrow.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pandas/tests/extension/test_arrow.py b/pandas/tests/extension/test_arrow.py index b4964205623c2..ba1a3bfc6ddf5 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -281,9 +281,7 @@ def test_map(self, data_missing, na_action): if data_missing.dtype.kind in "mM": mapper = lambda x: x result = data_missing.map(mapper, na_action=na_action) - expected = map_array( - data_missing.to_numpy(dtype=object), mapper, na_action=na_action - ) + expected = map_array(data_missing.to_numpy(), mapper, na_action=na_action) tm.assert_numpy_array_equal(result, expected) else: result = data_missing.map(lambda x: x, na_action=na_action)