Skip to content

Commit 2712c8f

Browse files
TomAugspurgerjreback
authored andcommitted
Ensure that DatetimeArray keeps reference to original data (pandas-dev#23956)
1 parent adc47d8 commit 2712c8f

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

pandas/_libs/tslibs/conversion.pyx

+4-1
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,13 @@ def ensure_datetime64ns(arr: ndarray, copy: bool=True):
9999

100100
ivalues = arr.view(np.int64).ravel()
101101

102-
result = np.empty(shape, dtype='M8[ns]')
102+
result = np.empty(shape, dtype=NS_DTYPE)
103103
iresult = result.ravel().view(np.int64)
104104

105105
if len(iresult) == 0:
106+
result = arr.view(NS_DTYPE)
107+
if copy:
108+
result = result.copy()
106109
return result
107110

108111
unit = get_datetime64_unit(arr.flat[0])

pandas/tests/arrays/test_datetimelike.py

+9
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,15 @@ def test_array_i8_dtype(self, tz_naive_fixture):
167167
assert result.base is expected.base
168168
assert result.base is not None
169169

170+
def test_from_array_keeps_base(self):
171+
# Ensure that DatetimeArray._data.base isn't lost.
172+
arr = np.array(['2000-01-01', '2000-01-02'], dtype='M8[ns]')
173+
dta = DatetimeArray(arr)
174+
175+
assert dta._data is arr
176+
dta = DatetimeArray(arr[:0])
177+
assert dta._data.base is arr
178+
170179
def test_from_dti(self, tz_naive_fixture):
171180
tz = tz_naive_fixture
172181
dti = pd.date_range('2016-01-01', periods=3, tz=tz)

pandas/tests/tslibs/test_conversion.py

+12
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,15 @@ def test_tz_convert_corner(self, arr):
5757
timezones.maybe_get_tz('US/Eastern'),
5858
timezones.maybe_get_tz('Asia/Tokyo'))
5959
tm.assert_numpy_array_equal(result, arr)
60+
61+
62+
class TestEnsureDatetime64NS(object):
63+
@pytest.mark.parametrize('copy', [True, False])
64+
@pytest.mark.parametrize('dtype', ['M8[ns]', 'M8[s]'])
65+
def test_length_zero_copy(self, dtype, copy):
66+
arr = np.array([], dtype=dtype)
67+
result = conversion.ensure_datetime64ns(arr, copy=copy)
68+
if copy:
69+
assert result.base is None
70+
else:
71+
assert result.base is arr

0 commit comments

Comments
 (0)