From 05d365c55767577cb5cb9ae16e51a4aaed0554d4 Mon Sep 17 00:00:00 2001 From: Brock Date: Thu, 25 Feb 2021 14:37:57 -0800 Subject: [PATCH 1/2] BUG: construct_1d_ndarray_preserving_na with dt64/td64 and object dtype --- pandas/core/dtypes/cast.py | 11 ++++++++++- pandas/tests/dtypes/cast/test_construct_ndarray.py | 10 ++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/pandas/core/dtypes/cast.py b/pandas/core/dtypes/cast.py index 6a0455e0b4cd6..39709d9de27f0 100644 --- a/pandas/core/dtypes/cast.py +++ b/pandas/core/dtypes/cast.py @@ -1839,7 +1839,16 @@ def construct_1d_ndarray_preserving_na( else: if dtype is not None: _disallow_mismatched_datetimelike(values, dtype) - subarr = np.array(values, dtype=dtype, copy=copy) + + if ( + dtype == object + and isinstance(values, np.ndarray) + and values.dtype.kind in ["m", "M"] + ): + # TODO(numpy#12550): special-case can be removed + subarr = construct_1d_object_array_from_listlike(list(values)) + else: + subarr = np.array(values, dtype=dtype, copy=copy) return subarr diff --git a/pandas/tests/dtypes/cast/test_construct_ndarray.py b/pandas/tests/dtypes/cast/test_construct_ndarray.py index fe271392122a2..06243f50973f1 100644 --- a/pandas/tests/dtypes/cast/test_construct_ndarray.py +++ b/pandas/tests/dtypes/cast/test_construct_ndarray.py @@ -19,3 +19,13 @@ def test_construct_1d_ndarray_preserving_na(values, dtype, expected): result = construct_1d_ndarray_preserving_na(values, dtype=dtype) tm.assert_numpy_array_equal(result, expected) + + +@pytest.mark.parametrize("dtype", ["m8[ns]", "M8[ns]"]) +def test_construct_1d_ndarray_preserving_na_datetimelike(dtype): + arr = np.arange(5).view(dtype) + expected = np.array(list(arr), dtype=object) + assert all(isinstance(x, type(arr[0])) for x in expected) + + result = construct_1d_ndarray_preserving_na(arr, np.dtype(object)) + tm.assert_numpy_array_equal(result, expected) From 6c7ae8e7e81b503940dbd2ad055ed2020ce4c36a Mon Sep 17 00:00:00 2001 From: Brock Date: Thu, 25 Feb 2021 20:12:01 -0800 Subject: [PATCH 2/2] 32bit compat --- pandas/tests/dtypes/cast/test_construct_ndarray.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/dtypes/cast/test_construct_ndarray.py b/pandas/tests/dtypes/cast/test_construct_ndarray.py index 06243f50973f1..72da93a5c4de3 100644 --- a/pandas/tests/dtypes/cast/test_construct_ndarray.py +++ b/pandas/tests/dtypes/cast/test_construct_ndarray.py @@ -23,7 +23,7 @@ def test_construct_1d_ndarray_preserving_na(values, dtype, expected): @pytest.mark.parametrize("dtype", ["m8[ns]", "M8[ns]"]) def test_construct_1d_ndarray_preserving_na_datetimelike(dtype): - arr = np.arange(5).view(dtype) + arr = np.arange(5, dtype=np.int64).view(dtype) expected = np.array(list(arr), dtype=object) assert all(isinstance(x, type(arr[0])) for x in expected)