From 2de30a782d3c0cbc310ebdc7768513e9ad67464b Mon Sep 17 00:00:00 2001 From: Brock Date: Fri, 30 Sep 2022 08:25:18 -0700 Subject: [PATCH 1/2] BUG: preserve EA in pd.array --- pandas/core/construction.py | 9 +++++++++ pandas/tests/arrays/test_array.py | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/pandas/core/construction.py b/pandas/core/construction.py index e1a69086609e9..88e82a67ab854 100644 --- a/pandas/core/construction.py +++ b/pandas/core/construction.py @@ -49,6 +49,7 @@ ) from pandas.core.dtypes.common import ( is_datetime64_ns_dtype, + is_dtype_equal, is_extension_array_dtype, is_float_dtype, is_integer_dtype, @@ -328,6 +329,14 @@ def array( if isinstance(dtype, str): dtype = registry.find(dtype) or dtype + if isinstance(data, ExtensionArray) and ( + dtype is None or is_dtype_equal(dtype, data.dtype) + ): + # e.g. TimedeltaArray[s], avoid casting to PandasArray + if copy: + return data.copy() + return data + if is_extension_array_dtype(dtype): cls = cast(ExtensionDtype, dtype).construct_array_type() return cls._from_sequence(data, dtype=dtype, copy=copy) diff --git a/pandas/tests/arrays/test_array.py b/pandas/tests/arrays/test_array.py index 9f8c277f07891..7ae849e26d5c3 100644 --- a/pandas/tests/arrays/test_array.py +++ b/pandas/tests/arrays/test_array.py @@ -124,6 +124,26 @@ None, TimedeltaArray._from_sequence(["1H", "2H"]), ), + ( + # preserve non-nano, i.e. don't cast to PandasArray + TimedeltaArray._simple_new( + np.arange(5).view("m8[s]"), dtype=np.dtype("m8[s]") + ), + None, + TimedeltaArray._simple_new( + np.arange(5).view("m8[s]"), dtype=np.dtype("m8[s]") + ), + ), + ( + # preserve non-nano, i.e. don't cast to PandasArray + TimedeltaArray._simple_new( + np.arange(5).view("m8[s]"), dtype=np.dtype("m8[s]") + ), + np.dtype("m8[s]"), + TimedeltaArray._simple_new( + np.arange(5).view("m8[s]"), dtype=np.dtype("m8[s]") + ), + ), # Category (["a", "b"], "category", pd.Categorical(["a", "b"])), ( From a95ef0ca2ef294e35f6957104c0e197a48e0fccd Mon Sep 17 00:00:00 2001 From: Brock Date: Fri, 30 Sep 2022 09:35:32 -0700 Subject: [PATCH 2/2] fix 32bit builds --- pandas/tests/arrays/test_array.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/tests/arrays/test_array.py b/pandas/tests/arrays/test_array.py index 7ae849e26d5c3..6666b613fb50a 100644 --- a/pandas/tests/arrays/test_array.py +++ b/pandas/tests/arrays/test_array.py @@ -127,21 +127,21 @@ ( # preserve non-nano, i.e. don't cast to PandasArray TimedeltaArray._simple_new( - np.arange(5).view("m8[s]"), dtype=np.dtype("m8[s]") + np.arange(5, dtype=np.int64).view("m8[s]"), dtype=np.dtype("m8[s]") ), None, TimedeltaArray._simple_new( - np.arange(5).view("m8[s]"), dtype=np.dtype("m8[s]") + np.arange(5, dtype=np.int64).view("m8[s]"), dtype=np.dtype("m8[s]") ), ), ( # preserve non-nano, i.e. don't cast to PandasArray TimedeltaArray._simple_new( - np.arange(5).view("m8[s]"), dtype=np.dtype("m8[s]") + np.arange(5, dtype=np.int64).view("m8[s]"), dtype=np.dtype("m8[s]") ), np.dtype("m8[s]"), TimedeltaArray._simple_new( - np.arange(5).view("m8[s]"), dtype=np.dtype("m8[s]") + np.arange(5, dtype=np.int64).view("m8[s]"), dtype=np.dtype("m8[s]") ), ), # Category