Skip to content

Commit 8ebe597

Browse files
API: consistent __array__ for datetime-like ExtensionArrays
1 parent 5edc439 commit 8ebe597

File tree

4 files changed

+64
-0
lines changed

4 files changed

+64
-0
lines changed

pandas/core/arrays/datetimelike.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,12 @@ def asi8(self):
132132
# ------------------------------------------------------------------
133133
# Array-like Methods
134134

135+
def __array__(self, dtype=None):
136+
# used for Timedelta/DatetimeArray, overwritten by PeriodArray
137+
if is_object_dtype(dtype):
138+
return np.array(list(self), dtype=object)
139+
return self._data
140+
135141
@property
136142
def shape(self):
137143
return (len(self),)

pandas/core/arrays/period.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,10 @@ def freq(self):
295295
"""Return the frequency object for this PeriodArray."""
296296
return self.dtype.freq
297297

298+
def __array__(self, dtype=None):
299+
# overriding DatetimelikeArray
300+
return np.array(list(self), dtype=object)
301+
298302
# --------------------------------------------------------------------
299303
# Vectorized analogues of Period properties
300304

pandas/tests/arrays/test_datetimelike.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,24 @@ def test_int_properties(self, datetime_index, propname):
126126

127127
tm.assert_numpy_array_equal(result, expected)
128128

129+
def test_array(self, datetime_index):
130+
arr = DatetimeArrayMixin(datetime_index)
131+
132+
result = np.asarray(arr)
133+
expected = arr._data
134+
assert result is expected
135+
tm.assert_numpy_array_equal(result, expected)
136+
137+
result = np.asarray(arr, dtype=object)
138+
expected = np.array(list(arr), dtype=object)
139+
tm.assert_numpy_array_equal(result, expected)
140+
141+
result = np.asarray(arr, dtype='int64')
142+
assert result is not arr.asi8
143+
assert not np.may_share_memory(arr, result)
144+
expected = arr.asi8.copy()
145+
tm.assert_numpy_array_equal(result, expected)
146+
129147

130148
class TestTimedeltaArray(object):
131149
def test_from_tdi(self):
@@ -174,6 +192,24 @@ def test_int_properties(self, timedelta_index, propname):
174192

175193
tm.assert_numpy_array_equal(result, expected)
176194

195+
def test_array(self, timedelta_index):
196+
arr = TimedeltaArrayMixin(timedelta_index)
197+
198+
result = np.asarray(arr)
199+
expected = arr._data
200+
assert result is expected
201+
tm.assert_numpy_array_equal(result, expected)
202+
203+
result = np.asarray(arr, dtype=object)
204+
expected = np.array(list(arr), dtype=object)
205+
tm.assert_numpy_array_equal(result, expected)
206+
207+
result = np.asarray(arr, dtype='int64')
208+
assert result is not arr.asi8
209+
assert not np.may_share_memory(arr, result)
210+
expected = arr.asi8.copy()
211+
tm.assert_numpy_array_equal(result, expected)
212+
177213

178214
class TestPeriodArray(object):
179215

@@ -228,3 +264,16 @@ def test_int_properties(self, period_index, propname):
228264
expected = np.array(getattr(pi, propname))
229265

230266
tm.assert_numpy_array_equal(result, expected)
267+
268+
def test_array(self, period_index):
269+
arr = PeriodArray(period_index)
270+
271+
result = np.asarray(arr)
272+
expected = np.array(list(arr), dtype=object)
273+
tm.assert_numpy_array_equal(result, expected)
274+
275+
result = np.asarray(arr, dtype=object)
276+
tm.assert_numpy_array_equal(result, expected)
277+
278+
with pytest.raises(TypeError):
279+
np.asarray(arr, dtype='int64')

pandas/tests/extension/base/interface.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from pandas.core.dtypes.common import is_extension_array_dtype
66
from pandas.core.dtypes.dtypes import ExtensionDtype
7+
import pandas.util.testing as tm
78

89
import pandas as pd
910

@@ -35,6 +36,10 @@ def test_array_interface(self, data):
3536
result = np.array(data)
3637
assert result[0] == data[0]
3738

39+
result = np.array(data, dtype=object)
40+
expected = np.array(list(data), dtype=object)
41+
tm.assert_numpy_array_equal(result, expected)
42+
3843
def test_repr(self, data):
3944
ser = pd.Series(data)
4045
assert data.dtype.name in repr(ser)

0 commit comments

Comments
 (0)