From 6c568a0688da1a7fc6728e8fce52790c4feac05c Mon Sep 17 00:00:00 2001 From: Brock Date: Thu, 18 Jun 2020 18:09:47 -0700 Subject: [PATCH] add Tick, BaseOffset to tslibs namespace --- pandas/_libs/tslibs/__init__.py | 4 +++- pandas/compat/pickle_compat.py | 6 +++--- pandas/core/arrays/_ranges.py | 6 ++---- pandas/core/arrays/datetimelike.py | 11 ++++++----- pandas/core/arrays/period.py | 9 ++++----- pandas/core/arrays/timedeltas.py | 4 +--- pandas/core/generic.py | 3 +-- pandas/core/indexes/datetimelike.py | 6 ++---- pandas/core/indexes/interval.py | 8 +++----- pandas/core/indexes/period.py | 8 +++----- pandas/core/window/rolling.py | 6 ++---- pandas/plotting/_matplotlib/timeseries.py | 5 ++--- pandas/tests/plotting/test_datetimelike.py | 9 ++++----- pandas/tests/tslibs/test_api.py | 2 ++ 14 files changed, 38 insertions(+), 49 deletions(-) diff --git a/pandas/_libs/tslibs/__init__.py b/pandas/_libs/tslibs/__init__.py index 6f173a4542bb0..76e356370de70 100644 --- a/pandas/_libs/tslibs/__init__.py +++ b/pandas/_libs/tslibs/__init__.py @@ -16,13 +16,15 @@ "Timestamp", "tz_convert_single", "to_offset", + "Tick", + "BaseOffset", ] from . import dtypes from .conversion import localize_pydatetime from .nattype import NaT, NaTType, iNaT, is_null_datetimelike, nat_strings from .np_datetime import OutOfBoundsDatetime -from .offsets import to_offset +from .offsets import BaseOffset, Tick, to_offset from .period import IncompatibleFrequency, Period from .resolution import Resolution from .timedeltas import Timedelta, delta_to_nanoseconds, ints_to_pytimedelta diff --git a/pandas/compat/pickle_compat.py b/pandas/compat/pickle_compat.py index 8a2626f9a7e68..0484de3fa165d 100644 --- a/pandas/compat/pickle_compat.py +++ b/pandas/compat/pickle_compat.py @@ -9,9 +9,9 @@ from typing import TYPE_CHECKING, Optional import warnings -from pandas import Index +from pandas._libs.tslibs import BaseOffset -from pandas.tseries.offsets import DateOffset +from pandas import Index if TYPE_CHECKING: from pandas import Series, DataFrame @@ -42,7 +42,7 @@ def load_reduce(self): return except TypeError: pass - elif args and issubclass(args[0], DateOffset): + elif args and issubclass(args[0], BaseOffset): # TypeError: object.__new__(Day) is not safe, use Day.__new__() cls = args[0] stack[-1] = cls.__new__(*args) diff --git a/pandas/core/arrays/_ranges.py b/pandas/core/arrays/_ranges.py index 3b090ca458d88..14b442bf71080 100644 --- a/pandas/core/arrays/_ranges.py +++ b/pandas/core/arrays/_ranges.py @@ -7,16 +7,14 @@ import numpy as np -from pandas._libs.tslibs import OutOfBoundsDatetime, Timedelta, Timestamp - -from pandas.tseries.offsets import DateOffset +from pandas._libs.tslibs import BaseOffset, OutOfBoundsDatetime, Timedelta, Timestamp def generate_regular_range( start: Union[Timestamp, Timedelta], end: Union[Timestamp, Timedelta], periods: int, - freq: DateOffset, + freq: BaseOffset, ): """ Generate a range of dates or timestamps with the spans between dates diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index 1fea6ca1b8a3d..a306268cd8ede 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -7,10 +7,12 @@ from pandas._libs import algos, lib from pandas._libs.tslibs import ( + BaseOffset, NaT, NaTType, Period, Resolution, + Tick, Timestamp, delta_to_nanoseconds, iNaT, @@ -62,7 +64,6 @@ from pandas.core.ops.invalid import invalid_comparison, make_invalid_op from pandas.tseries import frequencies -from pandas.tseries.offsets import DateOffset, Tick DTScalarOrNaT = Union[DatetimeLikeScalar, NaTType] @@ -421,7 +422,7 @@ def _with_freq(self, freq): if freq is None: # Always valid pass - elif len(self) == 0 and isinstance(freq, DateOffset): + elif len(self) == 0 and isinstance(freq, BaseOffset): # Always valid. In the TimedeltaArray case, we assume this # is a Tick offset. pass @@ -1398,7 +1399,7 @@ def __add__(self, other): result = self._add_nat() elif isinstance(other, (Tick, timedelta, np.timedelta64)): result = self._add_timedeltalike_scalar(other) - elif isinstance(other, DateOffset): + elif isinstance(other, BaseOffset): # specifically _not_ a Tick result = self._add_offset(other) elif isinstance(other, (datetime, np.datetime64)): @@ -1454,7 +1455,7 @@ def __sub__(self, other): result = self._sub_nat() elif isinstance(other, (Tick, timedelta, np.timedelta64)): result = self._add_timedeltalike_scalar(-other) - elif isinstance(other, DateOffset): + elif isinstance(other, BaseOffset): # specifically _not_ a Tick result = self._add_offset(-other) elif isinstance(other, (datetime, np.datetime64)): @@ -1778,7 +1779,7 @@ def maybe_infer_freq(freq): Whether we should inherit the freq of passed data. """ freq_infer = False - if not isinstance(freq, DateOffset): + if not isinstance(freq, BaseOffset): # if a passed freq is None, don't infer automatically if freq != "infer": freq = to_offset(freq) diff --git a/pandas/core/arrays/period.py b/pandas/core/arrays/period.py index 7902dd0410910..4b4df3445be4e 100644 --- a/pandas/core/arrays/period.py +++ b/pandas/core/arrays/period.py @@ -5,6 +5,7 @@ import numpy as np from pandas._libs.tslibs import ( + BaseOffset, NaT, NaTType, Timedelta, @@ -48,8 +49,6 @@ from pandas.core.arrays import datetimelike as dtl import pandas.core.common as com -from pandas.tseries.offsets import DateOffset - def _field_accessor(name: str, docstring=None): def f(self): @@ -280,7 +279,7 @@ def dtype(self) -> PeriodDtype: # error: Read-only property cannot override read-write property [misc] @property # type: ignore - def freq(self) -> DateOffset: + def freq(self) -> BaseOffset: """ Return the frequency object for this PeriodArray. """ @@ -656,7 +655,7 @@ def _addsub_int_array( res_values[self._isnan] = iNaT return type(self)(res_values, freq=self.freq) - def _add_offset(self, other: DateOffset): + def _add_offset(self, other: BaseOffset): assert not isinstance(other, Tick) if other.base != self.freq.base: @@ -784,7 +783,7 @@ def raise_on_incompatible(left, right): # GH#24283 error message format depends on whether right is scalar if isinstance(right, (np.ndarray, ABCTimedeltaArray)) or right is None: other_freq = None - elif isinstance(right, (ABCPeriodIndex, PeriodArray, Period, DateOffset)): + elif isinstance(right, (ABCPeriodIndex, PeriodArray, Period, BaseOffset)): other_freq = right.freqstr else: other_freq = delta_to_tick(Timedelta(right)).freqstr diff --git a/pandas/core/arrays/timedeltas.py b/pandas/core/arrays/timedeltas.py index f33b569b3d1f7..a378423df788b 100644 --- a/pandas/core/arrays/timedeltas.py +++ b/pandas/core/arrays/timedeltas.py @@ -4,7 +4,7 @@ import numpy as np from pandas._libs import lib, tslibs -from pandas._libs.tslibs import NaT, Period, Timedelta, Timestamp, iNaT, to_offset +from pandas._libs.tslibs import NaT, Period, Tick, Timedelta, Timestamp, iNaT, to_offset from pandas._libs.tslibs.conversion import precision_from_unit from pandas._libs.tslibs.fields import get_timedelta_field from pandas._libs.tslibs.timedeltas import array_to_timedelta64, parse_timedelta_unit @@ -35,8 +35,6 @@ from pandas.core.construction import extract_array from pandas.core.ops.common import unpack_zerodim_and_defer -from pandas.tseries.offsets import Tick - def _field_accessor(name, alias, docstring=None): def f(self): diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 9014e576eeb39..678e4041921f9 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -31,7 +31,7 @@ from pandas._config import config from pandas._libs import lib -from pandas._libs.tslibs import Timestamp, to_offset +from pandas._libs.tslibs import Tick, Timestamp, to_offset from pandas._typing import ( Axis, FilePathOrBuffer, @@ -101,7 +101,6 @@ from pandas.io.formats import format as fmt from pandas.io.formats.format import DataFrameFormatter, format_percentiles from pandas.io.formats.printing import pprint_thing -from pandas.tseries.offsets import Tick if TYPE_CHECKING: from pandas.core.resample import Resampler diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index ca6eb45e22c69..49b8ec3276e37 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -7,7 +7,7 @@ import numpy as np from pandas._libs import NaT, Timedelta, iNaT, join as libjoin, lib -from pandas._libs.tslibs import Resolution, timezones +from pandas._libs.tslibs import BaseOffset, Resolution, Tick, timezones from pandas._libs.tslibs.parsing import DateParseError from pandas._typing import Label from pandas.compat.numpy import function as nv @@ -44,8 +44,6 @@ from pandas.core.sorting import ensure_key_mapped from pandas.core.tools.timedeltas import to_timedelta -from pandas.tseries.offsets import DateOffset, Tick - _index_doc_kwargs = dict(ibase._index_doc_kwargs) _T = TypeVar("_T", bound="DatetimeIndexOpsMixin") @@ -91,7 +89,7 @@ class DatetimeIndexOpsMixin(ExtensionIndex): """ _data: Union[DatetimeArray, TimedeltaArray, PeriodArray] - freq: Optional[DateOffset] + freq: Optional[BaseOffset] freqstr: Optional[str] _resolution_obj: Resolution _bool_ops: List[str] = [] diff --git a/pandas/core/indexes/interval.py b/pandas/core/indexes/interval.py index 3be2bcd4888cb..f7a7b382b853f 100644 --- a/pandas/core/indexes/interval.py +++ b/pandas/core/indexes/interval.py @@ -9,7 +9,7 @@ from pandas._libs import lib from pandas._libs.interval import Interval, IntervalMixin, IntervalTree -from pandas._libs.tslibs import Timedelta, Timestamp, to_offset +from pandas._libs.tslibs import BaseOffset, Timedelta, Timestamp, to_offset from pandas._typing import AnyArrayLike, Label from pandas.errors import InvalidIndexError from pandas.util._decorators import Appender, Substitution, cache_readonly @@ -56,8 +56,6 @@ from pandas.core.indexes.timedeltas import TimedeltaIndex, timedelta_range from pandas.core.ops import get_op_result_name -from pandas.tseries.offsets import DateOffset - _VALID_CLOSED = {"left", "right", "both", "neither"} _index_doc_kwargs = dict(ibase._index_doc_kwargs) @@ -1161,8 +1159,8 @@ def _is_type_compatible(a, b) -> bool: """ Helper for interval_range to check type compat of start/end/freq. """ - is_ts_compat = lambda x: isinstance(x, (Timestamp, DateOffset)) - is_td_compat = lambda x: isinstance(x, (Timedelta, DateOffset)) + is_ts_compat = lambda x: isinstance(x, (Timestamp, BaseOffset)) + is_td_compat = lambda x: isinstance(x, (Timedelta, BaseOffset)) return ( (is_number(a) and is_number(b)) or (is_ts_compat(a) and is_ts_compat(b)) diff --git a/pandas/core/indexes/period.py b/pandas/core/indexes/period.py index 68c2b44b23964..03e11b652477f 100644 --- a/pandas/core/indexes/period.py +++ b/pandas/core/indexes/period.py @@ -5,7 +5,7 @@ from pandas._libs import index as libindex from pandas._libs.lib import no_default -from pandas._libs.tslibs import Period, Resolution +from pandas._libs.tslibs import BaseOffset, Period, Resolution, Tick from pandas._libs.tslibs.parsing import DateParseError, parse_time_string from pandas._typing import DtypeObj, Label from pandas.errors import InvalidIndexError @@ -43,8 +43,6 @@ from pandas.core.indexes.numeric import Int64Index from pandas.core.ops import get_op_result_name -from pandas.tseries.offsets import DateOffset, Tick - _index_doc_kwargs = dict(ibase._index_doc_kwargs) _index_doc_kwargs.update(dict(target_klass="PeriodIndex or list of Periods")) @@ -145,7 +143,7 @@ class PeriodIndex(DatetimeIndexOpsMixin, Int64Index): _is_numeric_dtype = False _data: PeriodArray - freq: DateOffset + freq: BaseOffset _engine_type = libindex.PeriodEngine _supports_partial_string_indexing = True @@ -287,7 +285,7 @@ def _maybe_convert_timedelta(self, other): # _check_timedeltalike_freq_compat will raise if incompatible delta = self._data._check_timedeltalike_freq_compat(other) return delta - elif isinstance(other, DateOffset): + elif isinstance(other, BaseOffset): if other.base == self.freq.base: return other.n diff --git a/pandas/core/window/rolling.py b/pandas/core/window/rolling.py index ce0a2a9b95025..49858e5b5337b 100644 --- a/pandas/core/window/rolling.py +++ b/pandas/core/window/rolling.py @@ -10,7 +10,7 @@ import numpy as np -from pandas._libs.tslibs import to_offset +from pandas._libs.tslibs import BaseOffset, to_offset import pandas._libs.window.aggregations as window_aggregations from pandas._typing import Axis, FrameOrSeries, Scalar from pandas.compat._optional import import_optional_dependency @@ -55,8 +55,6 @@ ) from pandas.core.window.numba_ import generate_numba_apply_func -from pandas.tseries.offsets import DateOffset - def calculate_center_offset(window) -> int: """ @@ -1932,7 +1930,7 @@ def validate(self): # we allow rolling on a datetimelike index if (self.obj.empty or self.is_datetimelike) and isinstance( - self.window, (str, DateOffset, timedelta) + self.window, (str, BaseOffset, timedelta) ): self._validate_monotonic() diff --git a/pandas/plotting/_matplotlib/timeseries.py b/pandas/plotting/_matplotlib/timeseries.py index 8ffd30567b9ac..8f3571cf13cbc 100644 --- a/pandas/plotting/_matplotlib/timeseries.py +++ b/pandas/plotting/_matplotlib/timeseries.py @@ -5,7 +5,7 @@ import numpy as np -from pandas._libs.tslibs import Period, to_offset +from pandas._libs.tslibs import BaseOffset, Period, to_offset from pandas._libs.tslibs.dtypes import FreqGroup from pandas._typing import FrameOrSeriesUnion @@ -22,7 +22,6 @@ TimeSeries_TimedeltaFormatter, ) from pandas.tseries.frequencies import get_period_alias, is_subperiod, is_superperiod -from pandas.tseries.offsets import DateOffset if TYPE_CHECKING: from pandas import Series, Index # noqa:F401 @@ -218,7 +217,7 @@ def _use_dynamic_x(ax, data: "FrameOrSeriesUnion") -> bool: return True -def _get_index_freq(index: "Index") -> Optional[DateOffset]: +def _get_index_freq(index: "Index") -> Optional[BaseOffset]: freq = getattr(index, "freq", None) if freq is None: freq = getattr(index, "inferred_freq", None) diff --git a/pandas/tests/plotting/test_datetimelike.py b/pandas/tests/plotting/test_datetimelike.py index fa129167a744f..201856669103a 100644 --- a/pandas/tests/plotting/test_datetimelike.py +++ b/pandas/tests/plotting/test_datetimelike.py @@ -6,18 +6,17 @@ import numpy as np import pytest -from pandas._libs.tslibs import to_offset +from pandas._libs.tslibs import BaseOffset, to_offset import pandas.util._test_decorators as td from pandas import DataFrame, Index, NaT, Series, isna import pandas._testing as tm -from pandas.core.indexes.datetimes import bdate_range, date_range +from pandas.core.indexes.datetimes import DatetimeIndex, bdate_range, date_range from pandas.core.indexes.period import Period, PeriodIndex, period_range from pandas.core.indexes.timedeltas import timedelta_range -from pandas.core.resample import DatetimeIndex from pandas.tests.plotting.common import TestPlotBase -from pandas.tseries.offsets import DateOffset, WeekOfMonth +from pandas.tseries.offsets import WeekOfMonth @td.skip_if_no_mpl @@ -1509,7 +1508,7 @@ def _check_plot_works(f, freq=None, series=None, *args, **kwargs): ax = kwargs.pop("ax", plt.gca()) if series is not None: dfreq = series.index.freq - if isinstance(dfreq, DateOffset): + if isinstance(dfreq, BaseOffset): dfreq = dfreq.rule_code if orig_axfreq is None: assert ax.freq == dfreq diff --git a/pandas/tests/tslibs/test_api.py b/pandas/tests/tslibs/test_api.py index a119db6c68635..840a8c2fb68b1 100644 --- a/pandas/tests/tslibs/test_api.py +++ b/pandas/tests/tslibs/test_api.py @@ -25,6 +25,7 @@ def test_namespace(): ] api = [ + "BaseOffset", "NaT", "NaTType", "iNaT", @@ -34,6 +35,7 @@ def test_namespace(): "Period", "IncompatibleFrequency", "Resolution", + "Tick", "Timedelta", "Timestamp", "delta_to_nanoseconds",