From 9698da8a50e81e2dcf6f0bc097a1839ca7e0b17a Mon Sep 17 00:00:00 2001 From: Brock Date: Mon, 21 Jun 2021 08:10:13 -0700 Subject: [PATCH] REF: implement PeriodDtypeBase.resolution --- pandas/_libs/tslibs/dtypes.pyx | 13 +++++++++++++ pandas/core/indexes/period.py | 12 ++---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/pandas/_libs/tslibs/dtypes.pyx b/pandas/_libs/tslibs/dtypes.pyx index 415bdf74db80a..f79ffd2d425c4 100644 --- a/pandas/_libs/tslibs/dtypes.pyx +++ b/pandas/_libs/tslibs/dtypes.pyx @@ -27,6 +27,11 @@ cdef class PeriodDtypeBase: # See also: libperiod.get_freq_group return (self._dtype_code // 1000) * 1000 + @property + def resolution(self) -> "Resolution": + fgc = self.freq_group_code + return Resolution.from_freq_group(FreqGroup(fgc)) + @property def date_offset(self): """ @@ -259,6 +264,14 @@ class Resolution(Enum): return cls.from_attrname(attr_name) + @classmethod + def from_freq_group(cls, freq_group: FreqGroup) -> "Resolution": + abbrev = _reverse_period_code_map[freq_group.value].split("-")[0] + if abbrev == "B": + return cls.RESO_DAY + attrname = _abbrev_to_attrnames[abbrev] + return cls.from_attrname(attrname) + cdef dict _reso_str_map = { Resolution.RESO_NS.value: "nanosecond", diff --git a/pandas/core/indexes/period.py b/pandas/core/indexes/period.py index 731958e363b40..91488b41af6a1 100644 --- a/pandas/core/indexes/period.py +++ b/pandas/core/indexes/period.py @@ -424,17 +424,9 @@ def get_loc(self, key, method=None, tolerance=None): raise KeyError(f"Cannot interpret '{key}' as period") from err reso = Resolution.from_attrname(reso_str) - grp = reso.freq_group.value - freqn = self.dtype.freq_group_code - # _get_string_slice will handle cases where grp < freqn - assert grp >= freqn - - # BusinessDay is a bit strange. It has a *lower* code, but we never parse - # a string as "BusinessDay" resolution, just Day. - if grp == freqn or ( - reso == Resolution.RESO_DAY and self.dtype.freq.name == "B" - ): + if reso == self.dtype.resolution: + # the reso < self.dtype.resolution case goes through _get_string_slice key = Period(asdt, freq=self.freq) loc = self.get_loc(key, method=method, tolerance=tolerance) return loc