diff --git a/pandas/_libs/tslibs/conversion.pyx b/pandas/_libs/tslibs/conversion.pyx index 9d6daf3d42523..bf5429c39e8fe 100644 --- a/pandas/_libs/tslibs/conversion.pyx +++ b/pandas/_libs/tslibs/conversion.pyx @@ -99,10 +99,13 @@ def ensure_datetime64ns(arr: ndarray, copy: bool=True): ivalues = arr.view(np.int64).ravel() - result = np.empty(shape, dtype='M8[ns]') + result = np.empty(shape, dtype=NS_DTYPE) iresult = result.ravel().view(np.int64) if len(iresult) == 0: + result = arr.view(NS_DTYPE) + if copy: + result = result.copy() return result unit = get_datetime64_unit(arr.flat[0]) diff --git a/pandas/tests/arrays/test_datetimelike.py b/pandas/tests/arrays/test_datetimelike.py index a1242e2481fed..902a3dda92bd6 100644 --- a/pandas/tests/arrays/test_datetimelike.py +++ b/pandas/tests/arrays/test_datetimelike.py @@ -167,6 +167,15 @@ def test_array_i8_dtype(self, tz_naive_fixture): assert result.base is expected.base assert result.base is not None + def test_from_array_keeps_base(self): + # Ensure that DatetimeArray._data.base isn't lost. + arr = np.array(['2000-01-01', '2000-01-02'], dtype='M8[ns]') + dta = DatetimeArray(arr) + + assert dta._data is arr + dta = DatetimeArray(arr[:0]) + assert dta._data.base is arr + def test_from_dti(self, tz_naive_fixture): tz = tz_naive_fixture dti = pd.date_range('2016-01-01', periods=3, tz=tz) diff --git a/pandas/tests/tslibs/test_conversion.py b/pandas/tests/tslibs/test_conversion.py index fde1d1718a2a2..6bfc686ba830e 100644 --- a/pandas/tests/tslibs/test_conversion.py +++ b/pandas/tests/tslibs/test_conversion.py @@ -57,3 +57,15 @@ def test_tz_convert_corner(self, arr): timezones.maybe_get_tz('US/Eastern'), timezones.maybe_get_tz('Asia/Tokyo')) tm.assert_numpy_array_equal(result, arr) + + +class TestEnsureDatetime64NS(object): + @pytest.mark.parametrize('copy', [True, False]) + @pytest.mark.parametrize('dtype', ['M8[ns]', 'M8[s]']) + def test_length_zero_copy(self, dtype, copy): + arr = np.array([], dtype=dtype) + result = conversion.ensure_datetime64ns(arr, copy=copy) + if copy: + assert result.base is None + else: + assert result.base is arr