Skip to content

REF: implement PeriodDtypeBase.resolution #42162

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 25, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions pandas/_libs/tslibs/dtypes.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -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):
"""
Expand Down Expand Up @@ -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",
Expand Down
12 changes: 2 additions & 10 deletions pandas/core/indexes/period.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down