diff --git a/pandas/_libs/tslibs/__init__.py b/pandas/_libs/tslibs/__init__.py index 370b49f2c4fa3..965adc82df676 100644 --- a/pandas/_libs/tslibs/__init__.py +++ b/pandas/_libs/tslibs/__init__.py @@ -8,6 +8,7 @@ "OutOfBoundsDatetime", "IncompatibleFrequency", "Period", + "Resolution", "Timedelta", "delta_to_nanoseconds", "ints_to_pytimedelta", @@ -20,6 +21,7 @@ from .nattype import NaT, NaTType, iNaT, is_null_datetimelike, nat_strings from .np_datetime import OutOfBoundsDatetime from .period import IncompatibleFrequency, Period +from .resolution import Resolution from .timedeltas import Timedelta, delta_to_nanoseconds, ints_to_pytimedelta from .timestamps import Timestamp from .tzconversion import tz_convert_single diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index b9f712e4d64fe..55420181190aa 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -5,9 +5,16 @@ import numpy as np -from pandas._libs import NaT, NaTType, Period, Timestamp, algos, iNaT, lib -from pandas._libs.tslibs.resolution import Resolution -from pandas._libs.tslibs.timedeltas import delta_to_nanoseconds +from pandas._libs import algos, lib +from pandas._libs.tslibs import ( + NaT, + NaTType, + Period, + Resolution, + Timestamp, + delta_to_nanoseconds, + iNaT, +) from pandas._libs.tslibs.timestamps import ( RoundTo, integer_op_not_supported, @@ -1103,7 +1110,7 @@ def inferred_freq(self): return None @property # NB: override with cache_readonly in immutable subclasses - def _resolution(self) -> Optional[Resolution]: + def _resolution_obj(self) -> Optional[Resolution]: try: return Resolution.get_reso_from_freq(self.freqstr) except KeyError: @@ -1114,12 +1121,12 @@ def resolution(self) -> str: """ Returns day, hour, minute, second, millisecond or microsecond """ - if self._resolution is None: + if self._resolution_obj is None: if is_period_dtype(self.dtype): # somewhere in the past it was decided we default to day return "day" # otherwise we fall through and will raise - return Resolution.get_str(self._resolution) + return Resolution.get_str(self._resolution_obj) @classmethod def _validate_frequency(cls, index, freq, **kwargs): diff --git a/pandas/core/arrays/datetimes.py b/pandas/core/arrays/datetimes.py index bade1c031d556..f11f3ad974b37 100644 --- a/pandas/core/arrays/datetimes.py +++ b/pandas/core/arrays/datetimes.py @@ -537,7 +537,7 @@ def is_normalized(self): return conversion.is_date_array_normalized(self.asi8, self.tz) @property # NB: override with cache_readonly in immutable subclasses - def _resolution(self) -> libresolution.Resolution: + def _resolution_obj(self) -> libresolution.Resolution: return libresolution.get_resolution(self.asi8, self.tz) # ---------------------------------------------------------------- diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index 2a7cd0eac04a6..21f4b3f8bb76a 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 timezones +from pandas._libs.tslibs import Resolution, timezones from pandas._libs.tslibs.parsing import DateParseError from pandas._typing import Label from pandas.compat.numpy import function as nv @@ -78,7 +78,7 @@ def wrapper(left, right): @inherit_names( - ["inferred_freq", "_isnan", "_resolution", "resolution"], + ["inferred_freq", "_isnan", "_resolution_obj", "resolution"], DatetimeLikeArrayMixin, cache=True, ) @@ -93,7 +93,7 @@ class DatetimeIndexOpsMixin(ExtensionIndex): _data: Union[DatetimeArray, TimedeltaArray, PeriodArray] freq: Optional[DateOffset] freqstr: Optional[str] - _resolution: int + _resolution_obj: Resolution _bool_ops: List[str] = [] _field_ops: List[str] = [] diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 250038726b719..4677faa6b7d24 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -6,7 +6,7 @@ import numpy as np from pandas._libs import NaT, Period, Timestamp, index as libindex, lib, tslib -from pandas._libs.tslibs import fields, parsing, resolution as libresolution, timezones +from pandas._libs.tslibs import Resolution, fields, parsing, timezones from pandas._libs.tslibs.frequencies import get_freq_group from pandas._libs.tslibs.offsets import prefix_mapping from pandas._typing import DtypeObj, Label @@ -72,7 +72,9 @@ def _new_DatetimeIndex(cls, d): DatetimeArray, wrap=True, ) -@inherit_names(["_timezone", "is_normalized", "_resolution"], DatetimeArray, cache=True) +@inherit_names( + ["_timezone", "is_normalized", "_resolution_obj"], DatetimeArray, cache=True +) @inherit_names( [ "_bool_ops", @@ -525,7 +527,7 @@ def _validate_partial_date_slice(self, reso: str): if ( self.is_monotonic and reso in ["day", "hour", "minute", "second"] - and self._resolution >= libresolution.Resolution.from_attrname(reso) + and self._resolution_obj >= Resolution.from_attrname(reso) ): # These resolution/monotonicity validations came from GH3931, # GH3452 and GH2369. diff --git a/pandas/tests/tslibs/test_api.py b/pandas/tests/tslibs/test_api.py index 5518760dbacb3..908f9fa699891 100644 --- a/pandas/tests/tslibs/test_api.py +++ b/pandas/tests/tslibs/test_api.py @@ -33,6 +33,7 @@ def test_namespace(): "OutOfBoundsDatetime", "Period", "IncompatibleFrequency", + "Resolution", "Timedelta", "Timestamp", "delta_to_nanoseconds",