Skip to content

Commit a65efb0

Browse files
committed
Update .array
We have Series/Index[datetime64[ns]] be a DatetimeArray
1 parent efa1c2c commit a65efb0

File tree

3 files changed

+24
-17
lines changed

3 files changed

+24
-17
lines changed

pandas/arrays/__init__.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,20 @@
55
"""
66
from pandas.core.arrays import (
77
IntervalArray, PeriodArray, Categorical, SparseArray, IntegerArray,
8-
PandasArray
8+
PandasArray,
9+
DatetimeArrayMixin as DatetimeArray,
10+
TimedeltaArrayMixin as TimedeltaArray,
11+
912
)
1013

1114

1215
__all__ = [
1316
'Categorical',
17+
'DatetimeArray',
1418
'IntegerArray',
1519
'IntervalArray',
1620
'PandasArray',
1721
'PeriodArray',
1822
'SparseArray',
23+
'TimedeltaArray',
1924
]

pandas/core/base.py

+13-13
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,10 @@
1515
from pandas.util._validators import validate_bool_kwarg
1616

1717
from pandas.core.dtypes.common import (
18-
is_datetime64tz_dtype, is_datetimelike, is_extension_array_dtype,
19-
is_extension_type, is_list_like, is_object_dtype, is_scalar)
20-
from pandas.core.dtypes.generic import (
21-
ABCDataFrame, ABCDatetimeArray, ABCIndexClass, ABCSeries,
22-
ABCTimedeltaArray)
18+
is_datetime64_ns_dtype, is_datetime64tz_dtype, is_datetimelike,
19+
is_extension_array_dtype, is_extension_type, is_list_like, is_object_dtype,
20+
is_scalar, is_timedelta64_ns_dtype)
21+
from pandas.core.dtypes.generic import ABCDataFrame, ABCIndexClass, ABCSeries
2322
from pandas.core.dtypes.missing import isna
2423

2524
from pandas.core import algorithms, common as com
@@ -851,16 +850,17 @@ def array(self):
851850
"""
852851
result = self._values
853852

854-
if not (is_extension_array_dtype(result.dtype)
855-
or isinstance(result, (ABCDatetimeArray, ABCTimedeltaArray))):
856-
# TODO: Should this be a DatetimeArray or PandasArray
857-
# for tz-naive data?
858-
# DatetimeArray is a bit strange, since tz-naive
859-
# arrays are an ExtensionArray, but the dtype is not
860-
# an extension dtype.
861-
from pandas.core.arrays.numpy_ import PandasArray
853+
if is_datetime64_ns_dtype(result.dtype):
854+
from pandas.arrays import DatetimeArray
855+
result = DatetimeArray(result)
856+
elif is_timedelta64_ns_dtype(result.dtype):
857+
from pandas.arrays import TimedeltaArray
858+
result = TimedeltaArray(result)
862859

860+
elif not is_extension_array_dtype(result.dtype):
861+
from pandas.arrays import PandasArray
863862
result = PandasArray(result)
863+
864864
return result
865865

866866
def to_numpy(self, dtype=None, copy=False):

pandas/tests/test_base.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -1211,7 +1211,6 @@ def test_ndarray_values(array, expected):
12111211

12121212
@pytest.mark.parametrize("arr", [
12131213
np.array([1, 2, 3]),
1214-
np.array([1, 2, 3], dtype="datetime64[ns]"),
12151214
])
12161215
def test_numpy_array(arr):
12171216
ser = pd.Series(arr)
@@ -1223,7 +1222,10 @@ def test_numpy_array(arr):
12231222
def test_numpy_array_all_dtypes(any_numpy_dtype):
12241223
ser = pd.Series(dtype=any_numpy_dtype)
12251224
result = ser.array
1226-
assert isinstance(result, PandasArray)
1225+
if is_datetime64_dtype(any_numpy_dtype):
1226+
assert isinstance(result, DatetimeArray)
1227+
else:
1228+
assert isinstance(result, PandasArray)
12271229

12281230

12291231
@pytest.mark.parametrize("array, attr", [
@@ -1232,7 +1234,7 @@ def test_numpy_array_all_dtypes(any_numpy_dtype):
12321234
(pd.core.arrays.integer_array([0, np.nan]), '_data'),
12331235
(pd.core.arrays.IntervalArray.from_breaks([0, 1]), '_left'),
12341236
(pd.SparseArray([0, 1]), '_sparse_values'),
1235-
# TODO: tz-naive Datetime. DatetimeArray or ndarray?
1237+
(DatetimeArray(np.array([1, 2], dtype="datetime64[ns]")), "_data"),
12361238
# tz-aware Datetime
12371239
(DatetimeArray(np.array(['2000-01-01T12:00:00',
12381240
'2000-01-02T12:00:00'],

0 commit comments

Comments
 (0)