From 1f10b8d855218e81aaa0ab1e13df379ce885c1ae Mon Sep 17 00:00:00 2001 From: Tom Augspurger Date: Thu, 3 Jan 2019 14:18:14 -0600 Subject: [PATCH 1/4] DatetimeArray --- pandas/arrays/__init__.py | 2 +- pandas/core/arrays/__init__.py | 2 +- pandas/core/arrays/array_.py | 4 ++-- pandas/core/arrays/datetimelike.py | 4 ++-- pandas/core/arrays/datetimes.py | 12 ++++++------ pandas/core/arrays/period.py | 4 ++-- pandas/core/arrays/timedeltas.py | 10 +++++----- pandas/core/dtypes/dtypes.py | 4 ++-- pandas/core/indexes/accessors.py | 3 +-- pandas/core/indexes/datetimes.py | 2 +- pandas/core/internals/blocks.py | 2 +- pandas/core/series.py | 2 +- pandas/core/tools/datetimes.py | 2 +- pandas/tests/arithmetic/test_datetime64.py | 8 ++++---- pandas/tests/arrays/test_datetimelike.py | 3 +-- pandas/tests/arrays/test_datetimes.py | 2 +- pandas/tests/extension/test_datetime.py | 2 +- pandas/tests/indexes/datetimes/test_astype.py | 2 +- pandas/tests/indexes/datetimes/test_construction.py | 3 +-- pandas/tests/indexes/datetimes/test_tools.py | 2 +- pandas/tests/internals/test_internals.py | 2 +- pandas/tests/test_algos.py | 2 +- pandas/tests/test_base.py | 3 +-- pandas/tests/test_nanops.py | 2 +- pandas/util/testing.py | 4 ++-- 25 files changed, 42 insertions(+), 46 deletions(-) diff --git a/pandas/arrays/__init__.py b/pandas/arrays/__init__.py index 5433d11eccff9..2671afadba8bd 100644 --- a/pandas/arrays/__init__.py +++ b/pandas/arrays/__init__.py @@ -6,7 +6,7 @@ from pandas.core.arrays import ( IntervalArray, PeriodArray, Categorical, SparseArray, IntegerArray, PandasArray, - DatetimeArrayMixin as DatetimeArray, + DatetimeArray, TimedeltaArrayMixin as TimedeltaArray, ) diff --git a/pandas/core/arrays/__init__.py b/pandas/core/arrays/__init__.py index d6a61a26a954f..7db54580f3857 100644 --- a/pandas/core/arrays/__init__.py +++ b/pandas/core/arrays/__init__.py @@ -3,7 +3,7 @@ ExtensionOpsMixin, ExtensionScalarOpsMixin) from .categorical import Categorical # noqa -from .datetimes import DatetimeArrayMixin # noqa +from .datetimes import DatetimeArray # noqa from .interval import IntervalArray # noqa from .period import PeriodArray, period_array # noqa from .timedeltas import TimedeltaArrayMixin # noqa diff --git a/pandas/core/arrays/array_.py b/pandas/core/arrays/array_.py index 4e84c62bce3d6..b6648c3d3f31a 100644 --- a/pandas/core/arrays/array_.py +++ b/pandas/core/arrays/array_.py @@ -184,7 +184,7 @@ def array(data, # type: Sequence[object] """ from pandas.core.arrays import ( period_array, ExtensionArray, IntervalArray, PandasArray, - DatetimeArrayMixin, + DatetimeArray, TimedeltaArrayMixin, ) from pandas.core.internals.arrays import extract_array @@ -228,7 +228,7 @@ def array(data, # type: Sequence[object] elif inferred_dtype.startswith('datetime'): # datetime, datetime64 try: - return DatetimeArrayMixin._from_sequence(data, copy=copy) + return DatetimeArray._from_sequence(data, copy=copy) except ValueError: # Mixture of timezones, fall back to PandasArray pass diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index 8b5445bedd46c..60be8f21799d8 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -1306,8 +1306,8 @@ def __rsub__(self, other): # we need to wrap in DatetimeArray/Index and flip the operation if not isinstance(other, DatetimeLikeArrayMixin): # Avoid down-casting DatetimeIndex - from pandas.core.arrays import DatetimeArrayMixin - other = DatetimeArrayMixin(other) + from pandas.core.arrays import DatetimeArray + other = DatetimeArray(other) return other - self elif (is_datetime64_any_dtype(self) and hasattr(other, 'dtype') and not is_datetime64_any_dtype(other)): diff --git a/pandas/core/arrays/datetimes.py b/pandas/core/arrays/datetimes.py index c428fd2e75e08..a9f2d79ec3614 100644 --- a/pandas/core/arrays/datetimes.py +++ b/pandas/core/arrays/datetimes.py @@ -127,7 +127,7 @@ def wrapper(self, other): except ValueError: other = np.array(other, dtype=np.object_) elif not isinstance(other, (np.ndarray, ABCIndexClass, ABCSeries, - DatetimeArrayMixin)): + DatetimeArray)): # Following Timestamp convention, __eq__ is all-False # and __ne__ is all True, others raise TypeError. return ops.invalid_comparison(self, other, op) @@ -176,9 +176,9 @@ def wrapper(self, other): return compat.set_function_name(wrapper, opname, cls) -class DatetimeArrayMixin(dtl.DatetimeLikeArrayMixin, - dtl.TimelikeOps, - dtl.DatelikeOps): +class DatetimeArray(dtl.DatetimeLikeArrayMixin, + dtl.TimelikeOps, + dtl.DatelikeOps): """ Pandas ExtensionArray for tz-naive or tz-aware datetime data. @@ -718,7 +718,7 @@ def _add_delta(self, delta): ------- result : DatetimeArray """ - new_values = super(DatetimeArrayMixin, self)._add_delta(delta) + new_values = super(DatetimeArray, self)._add_delta(delta) return type(self)._from_sequence(new_values, tz=self.tz, freq='infer') # ----------------------------------------------------------------- @@ -1610,7 +1610,7 @@ def to_julian_date(self): ) / 24.0) -DatetimeArrayMixin._add_comparison_ops() +DatetimeArray._add_comparison_ops() # ------------------------------------------------------------------- diff --git a/pandas/core/arrays/period.py b/pandas/core/arrays/period.py index 70da02f2ba0a1..0eeb3f718734a 100644 --- a/pandas/core/arrays/period.py +++ b/pandas/core/arrays/period.py @@ -327,7 +327,7 @@ def to_timestamp(self, freq=None, how='start'): ------- DatetimeArray/Index """ - from pandas.core.arrays import DatetimeArrayMixin + from pandas.core.arrays import DatetimeArray how = libperiod._validate_end_alias(how) @@ -351,7 +351,7 @@ def to_timestamp(self, freq=None, how='start'): new_data = self.asfreq(freq, how=how) new_data = libperiod.periodarr_to_dt64arr(new_data.asi8, base) - return DatetimeArrayMixin._from_sequence(new_data, freq='infer') + return DatetimeArray._from_sequence(new_data, freq='infer') # -------------------------------------------------------------------- # Array-like / EA-Interface Methods diff --git a/pandas/core/arrays/timedeltas.py b/pandas/core/arrays/timedeltas.py index 3677d041886b3..98ec9d5b45246 100644 --- a/pandas/core/arrays/timedeltas.py +++ b/pandas/core/arrays/timedeltas.py @@ -357,15 +357,15 @@ def _add_datetime_arraylike(self, other): """ if isinstance(other, np.ndarray): # At this point we have already checked that dtype is datetime64 - from pandas.core.arrays import DatetimeArrayMixin - other = DatetimeArrayMixin(other) + from pandas.core.arrays import DatetimeArray + other = DatetimeArray(other) # defer to implementation in DatetimeArray return other + self def _add_datetimelike_scalar(self, other): # adding a timedeltaindex to a datetimelike - from pandas.core.arrays import DatetimeArrayMixin + from pandas.core.arrays import DatetimeArray assert other is not NaT other = Timestamp(other) @@ -373,14 +373,14 @@ def _add_datetimelike_scalar(self, other): # In this case we specifically interpret NaT as a datetime, not # the timedelta interpretation we would get by returning self + NaT result = self.asi8.view('m8[ms]') + NaT.to_datetime64() - return DatetimeArrayMixin(result) + return DatetimeArray(result) i8 = self.asi8 result = checked_add_with_arr(i8, other.value, arr_mask=self._isnan) result = self._maybe_mask_results(result) dtype = DatetimeTZDtype(tz=other.tz) if other.tz else _NS_DTYPE - return DatetimeArrayMixin(result, dtype=dtype, freq=self.freq) + return DatetimeArray(result, dtype=dtype, freq=self.freq) def _addsub_offset_array(self, other, op): # Add or subtract Array-like of DateOffset objects diff --git a/pandas/core/dtypes/dtypes.py b/pandas/core/dtypes/dtypes.py index 9e2564c4f825b..ac69927d4adf1 100644 --- a/pandas/core/dtypes/dtypes.py +++ b/pandas/core/dtypes/dtypes.py @@ -572,8 +572,8 @@ def construct_array_type(cls): ------- type """ - from pandas.core.arrays import DatetimeArrayMixin - return DatetimeArrayMixin + from pandas.core.arrays import DatetimeArray + return DatetimeArray @classmethod def construct_from_string(cls, string): diff --git a/pandas/core/indexes/accessors.py b/pandas/core/indexes/accessors.py index 842fcd0680467..3756b485da25a 100644 --- a/pandas/core/indexes/accessors.py +++ b/pandas/core/indexes/accessors.py @@ -12,8 +12,7 @@ from pandas.core.accessor import PandasDelegate, delegate_names from pandas.core.algorithms import take_1d from pandas.core.arrays import ( - DatetimeArrayMixin as DatetimeArray, PeriodArray, - TimedeltaArrayMixin as TimedeltaArray) + DatetimeArray, PeriodArray, TimedeltaArrayMixin as TimedeltaArray) from pandas.core.base import NoNewAttributesMixin, PandasObject from pandas.core.indexes.datetimes import DatetimeIndex from pandas.core.indexes.timedeltas import TimedeltaIndex diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 7d901f4656731..f396f081267b3 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -22,7 +22,7 @@ from pandas.core.accessor import delegate_names from pandas.core.arrays.datetimes import ( - DatetimeArrayMixin as DatetimeArray, _to_M8, validate_tz_from_dtype) + DatetimeArray, _to_M8, validate_tz_from_dtype) from pandas.core.base import _shared_docs import pandas.core.common as com from pandas.core.indexes.base import Index diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index 3b2c13af785d4..54d78fab87663 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -35,7 +35,7 @@ import pandas.core.algorithms as algos from pandas.core.arrays import ( - Categorical, DatetimeArrayMixin as DatetimeArray, ExtensionArray, + Categorical, DatetimeArray, ExtensionArray, TimedeltaArrayMixin as TimedeltaArray) from pandas.core.base import PandasObject import pandas.core.common as com diff --git a/pandas/core/series.py b/pandas/core/series.py index 52b60339a7d68..46ff04fdd31ae 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -1586,7 +1586,7 @@ def unique(self): >>> pd.Series([pd.Timestamp('2016-01-01', tz='US/Eastern') ... for _ in range(3)]).unique() - + ['2016-01-01 00:00:00-05:00'] Length: 1, dtype: datetime64[ns, US/Eastern] diff --git a/pandas/core/tools/datetimes.py b/pandas/core/tools/datetimes.py index 69d735d7fdc65..5b540ee88a3f3 100644 --- a/pandas/core/tools/datetimes.py +++ b/pandas/core/tools/datetimes.py @@ -171,7 +171,7 @@ def _convert_listlike_datetimes(arg, box, format, name=None, tz=None, - ndarray of Timestamps if box=False """ from pandas import DatetimeIndex - from pandas.core.arrays import DatetimeArrayMixin as DatetimeArray + from pandas.core.arrays import DatetimeArray from pandas.core.arrays.datetimes import ( maybe_convert_dtype, objects_to_datetime64ns) diff --git a/pandas/tests/arithmetic/test_datetime64.py b/pandas/tests/arithmetic/test_datetime64.py index f5c4808a09123..cf8e3e01f5cbf 100644 --- a/pandas/tests/arithmetic/test_datetime64.py +++ b/pandas/tests/arithmetic/test_datetime64.py @@ -1989,7 +1989,7 @@ def test_dti_sub_tdi(self, tz_naive_fixture): result = dti - tdi.values tm.assert_index_equal(result, expected) - msg = 'cannot subtract DatetimeArrayMixin from' + msg = 'cannot subtract DatetimeArray from' with pytest.raises(TypeError, match=msg): tdi.values - dti @@ -2016,7 +2016,7 @@ def test_dti_isub_tdi(self, tz_naive_fixture): msg = '|'.join(['cannot perform __neg__ with this index type:', 'ufunc subtract cannot use operands with types', - 'cannot subtract DatetimeArrayMixin from']) + 'cannot subtract DatetimeArray from']) with pytest.raises(TypeError, match=msg): tdi.values -= dti @@ -2036,9 +2036,9 @@ def test_dti_isub_tdi(self, tz_naive_fixture): def test_add_datetimelike_and_dti(self, addend, tz): # GH#9631 dti = DatetimeIndex(['2011-01-01', '2011-01-02']).tz_localize(tz) - msg = ('cannot add DatetimeArrayMixin and {0}' + msg = ('cannot add DatetimeArray and {0}' .format(type(addend).__name__)).replace('DatetimeIndex', - 'DatetimeArrayMixin') + 'DatetimeArray') with pytest.raises(TypeError, match=msg): dti + addend with pytest.raises(TypeError, match=msg): diff --git a/pandas/tests/arrays/test_datetimelike.py b/pandas/tests/arrays/test_datetimelike.py index 348ac4579ffb5..f1d66e8497df8 100644 --- a/pandas/tests/arrays/test_datetimelike.py +++ b/pandas/tests/arrays/test_datetimelike.py @@ -6,8 +6,7 @@ import pandas as pd from pandas.core.arrays import ( - DatetimeArrayMixin as DatetimeArray, PeriodArray, - TimedeltaArrayMixin as TimedeltaArray) + DatetimeArray, PeriodArray, TimedeltaArrayMixin as TimedeltaArray) import pandas.util.testing as tm diff --git a/pandas/tests/arrays/test_datetimes.py b/pandas/tests/arrays/test_datetimes.py index 1375969c961fd..8890593b1fa9d 100644 --- a/pandas/tests/arrays/test_datetimes.py +++ b/pandas/tests/arrays/test_datetimes.py @@ -10,7 +10,7 @@ from pandas.core.dtypes.dtypes import DatetimeTZDtype import pandas as pd -from pandas.core.arrays import DatetimeArrayMixin as DatetimeArray +from pandas.core.arrays import DatetimeArray from pandas.core.arrays.datetimes import sequence_to_dt64ns import pandas.util.testing as tm diff --git a/pandas/tests/extension/test_datetime.py b/pandas/tests/extension/test_datetime.py index 7c4491d6edbcf..3a59f895efd7d 100644 --- a/pandas/tests/extension/test_datetime.py +++ b/pandas/tests/extension/test_datetime.py @@ -4,7 +4,7 @@ from pandas.core.dtypes.dtypes import DatetimeTZDtype import pandas as pd -from pandas.core.arrays import DatetimeArrayMixin as DatetimeArray +from pandas.core.arrays import DatetimeArray from pandas.tests.extension import base diff --git a/pandas/tests/indexes/datetimes/test_astype.py b/pandas/tests/indexes/datetimes/test_astype.py index cda7a005c40c7..562be4cf85864 100644 --- a/pandas/tests/indexes/datetimes/test_astype.py +++ b/pandas/tests/indexes/datetimes/test_astype.py @@ -177,7 +177,7 @@ def test_astype_object_with_nat(self): def test_astype_raises(self, dtype): # GH 13149, GH 13209 idx = DatetimeIndex(['2016-05-16', 'NaT', NaT, np.NaN]) - msg = 'Cannot cast DatetimeArrayMixin to dtype' + msg = 'Cannot cast DatetimeArray to dtype' with pytest.raises(TypeError, match=msg): idx.astype(dtype) diff --git a/pandas/tests/indexes/datetimes/test_construction.py b/pandas/tests/indexes/datetimes/test_construction.py index bca99d27bda56..97de4cd98dedf 100644 --- a/pandas/tests/indexes/datetimes/test_construction.py +++ b/pandas/tests/indexes/datetimes/test_construction.py @@ -13,8 +13,7 @@ from pandas import ( DatetimeIndex, Index, Timestamp, date_range, datetime, offsets, to_datetime) -from pandas.core.arrays import ( - DatetimeArrayMixin as DatetimeArray, period_array) +from pandas.core.arrays import DatetimeArray, period_array import pandas.util.testing as tm diff --git a/pandas/tests/indexes/datetimes/test_tools.py b/pandas/tests/indexes/datetimes/test_tools.py index deb1850a8b483..50c8f8d4c1f4c 100644 --- a/pandas/tests/indexes/datetimes/test_tools.py +++ b/pandas/tests/indexes/datetimes/test_tools.py @@ -24,7 +24,7 @@ from pandas import ( DataFrame, DatetimeIndex, Index, NaT, Series, Timestamp, compat, date_range, isna, to_datetime) -from pandas.core.arrays import DatetimeArrayMixin as DatetimeArray +from pandas.core.arrays import DatetimeArray from pandas.core.tools import datetimes as tools from pandas.util import testing as tm from pandas.util.testing import assert_series_equal diff --git a/pandas/tests/internals/test_internals.py b/pandas/tests/internals/test_internals.py index b9196971d2e53..f95cbb5116525 100644 --- a/pandas/tests/internals/test_internals.py +++ b/pandas/tests/internals/test_internals.py @@ -15,7 +15,7 @@ from pandas.compat import OrderedDict, lrange from pandas.core.arrays import ( - DatetimeArrayMixin as DatetimeArray, + DatetimeArray, TimedeltaArrayMixin as TimedeltaArray, ) from pandas.core.internals import (SingleBlockManager, diff --git a/pandas/tests/test_algos.py b/pandas/tests/test_algos.py index 294eae9d45bee..42e9b1f5af8ad 100644 --- a/pandas/tests/test_algos.py +++ b/pandas/tests/test_algos.py @@ -22,7 +22,7 @@ Categorical, CategoricalIndex, DatetimeIndex, Index, IntervalIndex, Series, Timestamp, compat) import pandas.core.algorithms as algos -from pandas.core.arrays import DatetimeArrayMixin as DatetimeArray +from pandas.core.arrays import DatetimeArray import pandas.core.common as com import pandas.util.testing as tm from pandas.util.testing import assert_almost_equal diff --git a/pandas/tests/test_base.py b/pandas/tests/test_base.py index f60d73ea1b05b..54d7c56951721 100644 --- a/pandas/tests/test_base.py +++ b/pandas/tests/test_base.py @@ -24,8 +24,7 @@ Panel, PeriodIndex, Series, Timedelta, TimedeltaIndex, Timestamp) from pandas.core.accessor import PandasDelegate from pandas.core.arrays import ( - DatetimeArrayMixin as DatetimeArray, PandasArray, - TimedeltaArrayMixin as TimedeltaArray) + DatetimeArray, PandasArray, TimedeltaArrayMixin as TimedeltaArray) from pandas.core.base import NoNewAttributesMixin, PandasObject from pandas.core.indexes.datetimelike import DatetimeIndexOpsMixin import pandas.util.testing as tm diff --git a/pandas/tests/test_nanops.py b/pandas/tests/test_nanops.py index cc793767d3af6..1e65118194be7 100644 --- a/pandas/tests/test_nanops.py +++ b/pandas/tests/test_nanops.py @@ -14,7 +14,7 @@ import pandas as pd from pandas import Series, isna -from pandas.core.arrays import DatetimeArrayMixin as DatetimeArray +from pandas.core.arrays import DatetimeArray import pandas.core.nanops as nanops import pandas.util.testing as tm diff --git a/pandas/util/testing.py b/pandas/util/testing.py index ebdfde2da24f8..1f4bb7f9451f7 100644 --- a/pandas/util/testing.py +++ b/pandas/util/testing.py @@ -36,8 +36,8 @@ IntervalIndex, MultiIndex, Panel, RangeIndex, Series, bdate_range) from pandas.core.algorithms import take_1d from pandas.core.arrays import ( - DatetimeArrayMixin as DatetimeArray, ExtensionArray, IntervalArray, - PeriodArray, TimedeltaArrayMixin as TimedeltaArray, period_array) + DatetimeArray, ExtensionArray, IntervalArray, PeriodArray, + TimedeltaArrayMixin as TimedeltaArray, period_array) import pandas.core.common as com from pandas.io.common import urlopen From 97a2d02d623f8dc3d8d769bb077e020e2d15dd8a Mon Sep 17 00:00:00 2001 From: Tom Augspurger Date: Thu, 3 Jan 2019 14:20:11 -0600 Subject: [PATCH 2/4] TimedeltaArray --- pandas/arrays/__init__.py | 2 +- pandas/core/arrays/__init__.py | 2 +- pandas/core/arrays/array_.py | 4 ++-- pandas/core/arrays/datetimelike.py | 8 ++++---- pandas/core/arrays/datetimes.py | 4 ++-- pandas/core/arrays/timedeltas.py | 10 +++++----- pandas/core/indexes/accessors.py | 3 +-- pandas/core/indexes/timedeltas.py | 3 +-- pandas/core/internals/blocks.py | 3 +-- pandas/tests/arithmetic/test_datetime64.py | 4 ++-- pandas/tests/arrays/test_datetimelike.py | 3 +-- pandas/tests/arrays/test_timedeltas.py | 2 +- pandas/tests/indexes/timedeltas/test_astype.py | 2 +- pandas/tests/indexes/timedeltas/test_construction.py | 2 +- pandas/tests/internals/test_internals.py | 2 +- pandas/tests/test_base.py | 3 +-- pandas/util/testing.py | 4 ++-- 17 files changed, 28 insertions(+), 33 deletions(-) diff --git a/pandas/arrays/__init__.py b/pandas/arrays/__init__.py index 2671afadba8bd..7d9b1b7c7a659 100644 --- a/pandas/arrays/__init__.py +++ b/pandas/arrays/__init__.py @@ -7,7 +7,7 @@ IntervalArray, PeriodArray, Categorical, SparseArray, IntegerArray, PandasArray, DatetimeArray, - TimedeltaArrayMixin as TimedeltaArray, + TimedeltaArray, ) diff --git a/pandas/core/arrays/__init__.py b/pandas/core/arrays/__init__.py index 7db54580f3857..1033ce784046e 100644 --- a/pandas/core/arrays/__init__.py +++ b/pandas/core/arrays/__init__.py @@ -6,7 +6,7 @@ from .datetimes import DatetimeArray # noqa from .interval import IntervalArray # noqa from .period import PeriodArray, period_array # noqa -from .timedeltas import TimedeltaArrayMixin # noqa +from .timedeltas import TimedeltaArray # noqa from .integer import ( # noqa IntegerArray, integer_array) from .sparse import SparseArray # noqa diff --git a/pandas/core/arrays/array_.py b/pandas/core/arrays/array_.py index b6648c3d3f31a..04842d82fca5d 100644 --- a/pandas/core/arrays/array_.py +++ b/pandas/core/arrays/array_.py @@ -185,7 +185,7 @@ def array(data, # type: Sequence[object] from pandas.core.arrays import ( period_array, ExtensionArray, IntervalArray, PandasArray, DatetimeArray, - TimedeltaArrayMixin, + TimedeltaArray, ) from pandas.core.internals.arrays import extract_array @@ -235,7 +235,7 @@ def array(data, # type: Sequence[object] elif inferred_dtype.startswith('timedelta'): # timedelta, timedelta64 - return TimedeltaArrayMixin._from_sequence(data, copy=copy) + return TimedeltaArray._from_sequence(data, copy=copy) # TODO(BooleanArray): handle this type diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index 60be8f21799d8..65f9bb14158bb 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -1228,9 +1228,9 @@ def __add__(self, other): return NotImplemented if is_timedelta64_dtype(result) and isinstance(result, np.ndarray): - from pandas.core.arrays import TimedeltaArrayMixin + from pandas.core.arrays import TimedeltaArray # TODO: infer freq? - return TimedeltaArrayMixin(result) + return TimedeltaArray(result) return result def __radd__(self, other): @@ -1295,9 +1295,9 @@ def __sub__(self, other): return NotImplemented if is_timedelta64_dtype(result) and isinstance(result, np.ndarray): - from pandas.core.arrays import TimedeltaArrayMixin + from pandas.core.arrays import TimedeltaArray # TODO: infer freq? - return TimedeltaArrayMixin(result) + return TimedeltaArray(result) return result def __rsub__(self, other): diff --git a/pandas/core/arrays/datetimes.py b/pandas/core/arrays/datetimes.py index a9f2d79ec3614..520121710cbd4 100644 --- a/pandas/core/arrays/datetimes.py +++ b/pandas/core/arrays/datetimes.py @@ -1135,10 +1135,10 @@ def to_perioddelta(self, freq): TimedeltaArray/Index """ # TODO: consider privatizing (discussion in GH#23113) - from pandas.core.arrays.timedeltas import TimedeltaArrayMixin + from pandas.core.arrays.timedeltas import TimedeltaArray i8delta = self.asi8 - self.to_period(freq).to_timestamp().asi8 m8delta = i8delta.view('m8[ns]') - return TimedeltaArrayMixin(m8delta) + return TimedeltaArray(m8delta) # ----------------------------------------------------------------- # Properties - Vectorized Timestamp Properties/Methods diff --git a/pandas/core/arrays/timedeltas.py b/pandas/core/arrays/timedeltas.py index 98ec9d5b45246..0ccf82ebf7edd 100644 --- a/pandas/core/arrays/timedeltas.py +++ b/pandas/core/arrays/timedeltas.py @@ -102,7 +102,7 @@ def wrapper(self, other): return compat.set_function_name(wrapper, opname, cls) -class TimedeltaArrayMixin(dtl.DatetimeLikeArrayMixin, dtl.TimelikeOps): +class TimedeltaArray(dtl.DatetimeLikeArrayMixin, dtl.TimelikeOps): _typ = "timedeltaarray" _scalar_type = Timedelta __array_priority__ = 1000 @@ -348,7 +348,7 @@ def _add_delta(self, delta): ------- result : TimedeltaArray """ - new_values = super(TimedeltaArrayMixin, self)._add_delta(delta) + new_values = super(TimedeltaArray, self)._add_delta(delta) return type(self)._from_sequence(new_values, freq='infer') def _add_datetime_arraylike(self, other): @@ -388,7 +388,7 @@ def _addsub_offset_array(self, other, op): # TimedeltaIndex can only operate with a subset of DateOffset # subclasses. Incompatible classes will raise AttributeError, # which we re-raise as TypeError - return super(TimedeltaArrayMixin, self)._addsub_offset_array( + return super(TimedeltaArray, self)._addsub_offset_array( other, op ) except AttributeError: @@ -813,7 +813,7 @@ def f(x): return result -TimedeltaArrayMixin._add_comparison_ops() +TimedeltaArray._add_comparison_ops() # --------------------------------------------------------------------- @@ -860,7 +860,7 @@ def sequence_to_td64ns(data, copy=False, unit="ns", errors="raise"): data = np.array(data, copy=False) elif isinstance(data, ABCSeries): data = data._values - elif isinstance(data, (ABCTimedeltaIndex, TimedeltaArrayMixin)): + elif isinstance(data, (ABCTimedeltaIndex, TimedeltaArray)): inferred_freq = data.freq data = data._data diff --git a/pandas/core/indexes/accessors.py b/pandas/core/indexes/accessors.py index 3756b485da25a..c43469d3c3a81 100644 --- a/pandas/core/indexes/accessors.py +++ b/pandas/core/indexes/accessors.py @@ -11,8 +11,7 @@ from pandas.core.accessor import PandasDelegate, delegate_names from pandas.core.algorithms import take_1d -from pandas.core.arrays import ( - DatetimeArray, PeriodArray, TimedeltaArrayMixin as TimedeltaArray) +from pandas.core.arrays import DatetimeArray, PeriodArray, TimedeltaArray from pandas.core.base import NoNewAttributesMixin, PandasObject from pandas.core.indexes.datetimes import DatetimeIndex from pandas.core.indexes.timedeltas import TimedeltaIndex diff --git a/pandas/core/indexes/timedeltas.py b/pandas/core/indexes/timedeltas.py index 5e8e6a423ab3f..9301638d4f632 100644 --- a/pandas/core/indexes/timedeltas.py +++ b/pandas/core/indexes/timedeltas.py @@ -17,8 +17,7 @@ from pandas.core.accessor import delegate_names from pandas.core.arrays import datetimelike as dtl -from pandas.core.arrays.timedeltas import ( - TimedeltaArrayMixin as TimedeltaArray, _is_convertible_to_td) +from pandas.core.arrays.timedeltas import TimedeltaArray, _is_convertible_to_td from pandas.core.base import _shared_docs import pandas.core.common as com from pandas.core.indexes.base import Index, _index_shared_docs diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index 54d78fab87663..bd16495e472b1 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -35,8 +35,7 @@ import pandas.core.algorithms as algos from pandas.core.arrays import ( - Categorical, DatetimeArray, ExtensionArray, - TimedeltaArrayMixin as TimedeltaArray) + Categorical, DatetimeArray, ExtensionArray, TimedeltaArray) from pandas.core.base import PandasObject import pandas.core.common as com from pandas.core.indexes.datetimes import DatetimeIndex diff --git a/pandas/tests/arithmetic/test_datetime64.py b/pandas/tests/arithmetic/test_datetime64.py index cf8e3e01f5cbf..f20d9a54e9da3 100644 --- a/pandas/tests/arithmetic/test_datetime64.py +++ b/pandas/tests/arithmetic/test_datetime64.py @@ -1981,7 +1981,7 @@ def test_dti_sub_tdi(self, tz_naive_fixture): result = dti - tdi tm.assert_index_equal(result, expected) - msg = 'cannot subtract .*TimedeltaArrayMixin' + msg = 'cannot subtract .*TimedeltaArray' with pytest.raises(TypeError, match=msg): tdi - dti @@ -2005,7 +2005,7 @@ def test_dti_isub_tdi(self, tz_naive_fixture): result -= tdi tm.assert_index_equal(result, expected) - msg = 'cannot subtract .* from a TimedeltaArrayMixin' + msg = 'cannot subtract .* from a TimedeltaArray' with pytest.raises(TypeError, match=msg): tdi -= dti diff --git a/pandas/tests/arrays/test_datetimelike.py b/pandas/tests/arrays/test_datetimelike.py index f1d66e8497df8..f76999a0dbc32 100644 --- a/pandas/tests/arrays/test_datetimelike.py +++ b/pandas/tests/arrays/test_datetimelike.py @@ -5,8 +5,7 @@ import pandas.compat as compat import pandas as pd -from pandas.core.arrays import ( - DatetimeArray, PeriodArray, TimedeltaArrayMixin as TimedeltaArray) +from pandas.core.arrays import DatetimeArray, PeriodArray, TimedeltaArray import pandas.util.testing as tm diff --git a/pandas/tests/arrays/test_timedeltas.py b/pandas/tests/arrays/test_timedeltas.py index 08ef27297cca5..481350640e1a6 100644 --- a/pandas/tests/arrays/test_timedeltas.py +++ b/pandas/tests/arrays/test_timedeltas.py @@ -4,7 +4,7 @@ import pytest import pandas as pd -from pandas.core.arrays import TimedeltaArrayMixin as TimedeltaArray +from pandas.core.arrays import TimedeltaArray import pandas.util.testing as tm diff --git a/pandas/tests/indexes/timedeltas/test_astype.py b/pandas/tests/indexes/timedeltas/test_astype.py index ae0dbf24f048e..3f5507612c8e6 100644 --- a/pandas/tests/indexes/timedeltas/test_astype.py +++ b/pandas/tests/indexes/timedeltas/test_astype.py @@ -83,7 +83,7 @@ def test_astype_timedelta64(self): def test_astype_raises(self, dtype): # GH 13149, GH 13209 idx = TimedeltaIndex([1e14, 'NaT', NaT, np.NaN]) - msg = 'Cannot cast TimedeltaArrayMixin to dtype' + msg = 'Cannot cast TimedeltaArray to dtype' with pytest.raises(TypeError, match=msg): idx.astype(dtype) diff --git a/pandas/tests/indexes/timedeltas/test_construction.py b/pandas/tests/indexes/timedeltas/test_construction.py index b9bbfaff06215..76f79e86e6f11 100644 --- a/pandas/tests/indexes/timedeltas/test_construction.py +++ b/pandas/tests/indexes/timedeltas/test_construction.py @@ -5,7 +5,7 @@ import pandas as pd from pandas import Timedelta, TimedeltaIndex, timedelta_range, to_timedelta -from pandas.core.arrays import TimedeltaArrayMixin as TimedeltaArray +from pandas.core.arrays import TimedeltaArray import pandas.util.testing as tm diff --git a/pandas/tests/internals/test_internals.py b/pandas/tests/internals/test_internals.py index f95cbb5116525..7147761d23caa 100644 --- a/pandas/tests/internals/test_internals.py +++ b/pandas/tests/internals/test_internals.py @@ -16,7 +16,7 @@ from pandas.compat import OrderedDict, lrange from pandas.core.arrays import ( DatetimeArray, - TimedeltaArrayMixin as TimedeltaArray, + TimedeltaArray, ) from pandas.core.internals import (SingleBlockManager, make_block, BlockManager) diff --git a/pandas/tests/test_base.py b/pandas/tests/test_base.py index 54d7c56951721..657f5f193c85e 100644 --- a/pandas/tests/test_base.py +++ b/pandas/tests/test_base.py @@ -23,8 +23,7 @@ CategoricalIndex, DataFrame, DatetimeIndex, Index, Interval, IntervalIndex, Panel, PeriodIndex, Series, Timedelta, TimedeltaIndex, Timestamp) from pandas.core.accessor import PandasDelegate -from pandas.core.arrays import ( - DatetimeArray, PandasArray, TimedeltaArrayMixin as TimedeltaArray) +from pandas.core.arrays import DatetimeArray, PandasArray, TimedeltaArray from pandas.core.base import NoNewAttributesMixin, PandasObject from pandas.core.indexes.datetimelike import DatetimeIndexOpsMixin import pandas.util.testing as tm diff --git a/pandas/util/testing.py b/pandas/util/testing.py index 1f4bb7f9451f7..2df43cd678764 100644 --- a/pandas/util/testing.py +++ b/pandas/util/testing.py @@ -36,8 +36,8 @@ IntervalIndex, MultiIndex, Panel, RangeIndex, Series, bdate_range) from pandas.core.algorithms import take_1d from pandas.core.arrays import ( - DatetimeArray, ExtensionArray, IntervalArray, PeriodArray, - TimedeltaArrayMixin as TimedeltaArray, period_array) + DatetimeArray, ExtensionArray, IntervalArray, PeriodArray, TimedeltaArray, + period_array) import pandas.core.common as com from pandas.io.common import urlopen From 863fcda467ad34819e5f5608b68ef30890d4d7f8 Mon Sep 17 00:00:00 2001 From: Tom Augspurger Date: Thu, 3 Jan 2019 14:21:32 -0600 Subject: [PATCH 3/4] missed one --- pandas/tests/dtypes/test_generic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/tests/dtypes/test_generic.py b/pandas/tests/dtypes/test_generic.py index 96f92fccc5a71..1622088d05f4d 100644 --- a/pandas/tests/dtypes/test_generic.py +++ b/pandas/tests/dtypes/test_generic.py @@ -22,8 +22,8 @@ class TestABCClasses(object): sparse_series = pd.Series([1, 2, 3]).to_sparse() sparse_array = pd.SparseArray(np.random.randn(10)) sparse_frame = pd.SparseDataFrame({'a': [1, -1, None]}) - datetime_array = pd.core.arrays.DatetimeArrayMixin(datetime_index) - timedelta_array = pd.core.arrays.TimedeltaArrayMixin(timedelta_index) + datetime_array = pd.core.arrays.DatetimeArray(datetime_index) + timedelta_array = pd.core.arrays.TimedeltaArray(timedelta_index) def test_abc_types(self): assert isinstance(pd.Index(['a', 'b', 'c']), gt.ABCIndex) From d66887230269f7800b41a3eb82a03f459413757e Mon Sep 17 00:00:00 2001 From: Tom Augspurger Date: Thu, 3 Jan 2019 14:23:48 -0600 Subject: [PATCH 4/4] update test --- pandas/tests/extension/test_datetime.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/extension/test_datetime.py b/pandas/tests/extension/test_datetime.py index 3a59f895efd7d..00ad35bf6a924 100644 --- a/pandas/tests/extension/test_datetime.py +++ b/pandas/tests/extension/test_datetime.py @@ -129,7 +129,7 @@ def test_arith_series_with_scalar(self, data, all_arithmetic_operators): def test_add_series_with_extension_array(self, data): # Datetime + Datetime not implemented s = pd.Series(data) - msg = 'cannot add DatetimeArray(Mixin)? and DatetimeArray(Mixin)?' + msg = 'cannot add DatetimeArray and DatetimeArray' with pytest.raises(TypeError, match=msg): s + data