From b542f7d41d1a03e85db5987a573f302bd84b45ba Mon Sep 17 00:00:00 2001 From: Brock Date: Tue, 2 Jun 2020 14:32:09 -0700 Subject: [PATCH 1/7] REF: operate on Resolution objs instead of ints --- pandas/_libs/tslibs/parsing.pyx | 2 +- pandas/_libs/tslibs/period.pyx | 1 + pandas/_libs/tslibs/resolution.pyx | 35 +++++++++++++++++++++++++ pandas/core/indexes/datetimelike.py | 8 +++--- pandas/core/indexes/datetimes.py | 17 +++++++----- pandas/core/indexes/period.py | 22 +++++++++------- pandas/tests/indexes/period/test_ops.py | 34 +++++++++++------------- 7 files changed, 80 insertions(+), 39 deletions(-) diff --git a/pandas/_libs/tslibs/parsing.pyx b/pandas/_libs/tslibs/parsing.pyx index 3a1af9fdb1e8f..8d523f01151e9 100644 --- a/pandas/_libs/tslibs/parsing.pyx +++ b/pandas/_libs/tslibs/parsing.pyx @@ -386,7 +386,7 @@ cdef inline object _parse_dateabbr_string(object date_string, datetime default, assert isinstance(date_string, str) if date_string in nat_strings: - return NaT, '' + return NaT, '' # TODO: reso str here? date_string = date_string.upper() date_len = len(date_string) diff --git a/pandas/_libs/tslibs/period.pyx b/pandas/_libs/tslibs/period.pyx index bc190825214c1..d50c4fc835714 100644 --- a/pandas/_libs/tslibs/period.pyx +++ b/pandas/_libs/tslibs/period.pyx @@ -2404,6 +2404,7 @@ class Period(_Period): value = str(value) value = value.upper() dt, reso = parse_time_string(value, freq) + # TODO: reso = Resolution.from_attrname(reso) if dt is NaT: ordinal = NPY_NAT diff --git a/pandas/_libs/tslibs/resolution.pyx b/pandas/_libs/tslibs/resolution.pyx index 91059638cd73a..dfdd2d3f06bca 100644 --- a/pandas/_libs/tslibs/resolution.pyx +++ b/pandas/_libs/tslibs/resolution.pyx @@ -8,6 +8,7 @@ from pandas._libs.tslibs.util cimport get_nat from pandas._libs.tslibs.np_datetime cimport ( npy_datetimestruct, dt64_to_dtstruct) from pandas._libs.tslibs.frequencies cimport attrname_to_abbrevs +from pandas._libs.tslibs.frequencies import FreqGroup from pandas._libs.tslibs.timezones cimport ( is_utc, is_tzlocal, maybe_get_tz, get_dst_info) from pandas._libs.tslibs.ccalendar cimport get_days_in_month @@ -26,6 +27,9 @@ cdef: int RESO_MIN = 4 int RESO_HR = 5 int RESO_DAY = 6 + #int RESO_MTH = 7 + int RESO_QTR = 8 + int RESO_YR = 9 _abbrev_to_attrnames = {v: k for k, v in attrname_to_abbrevs.items()} @@ -37,6 +41,9 @@ _reso_str_map = { RESO_MIN: "minute", RESO_HR: "hour", RESO_DAY: "day", + #RESO_MTH: "month", + RESO_QTR: "quarter", + RESO_YR: "year", } _str_reso_map = {v: k for k, v in _reso_str_map.items()} @@ -138,6 +145,9 @@ class Resolution(Enum): RESO_MIN = 4 RESO_HR = 5 RESO_DAY = 6 + #RESO_MTH = 7 + RESO_QTR = 8 + RESO_YR = 9 def __lt__(self, other): return self.value < other.value @@ -145,6 +155,31 @@ class Resolution(Enum): def __ge__(self, other): return self.value >= other.value + @property + def freq_group(self): + # TODO: annotate as returning FreqGroup once that is an enum + if self == Resolution.RESO_NS: + return FreqGroup.FR_NS + if self == Resolution.RESO_US: + return FreqGroup.FR_US + if self == Resolution.RESO_MS: + return FreqGroup.FR_MS + if self == Resolution.RESO_SEC: + return FreqGroup.FR_SEC + if self == Resolution.RESO_MIN: + return FreqGroup.FR_MIN + if self == Resolution.RESO_HR: + return FreqGroup.FR_HR + if self == Resolution.RESO_DAY: + return FreqGroup.FR_DAY + #if self == Resolution.RESO_MTH: + # return FreqGroup.FR_MTH + if self == Resolution.RESO_QTR: + return FreqGroup.FR_QTR + if self == Resolution.RESO_YR: + return FreqGroup.FR_ANN + raise ValueError(self) + @classmethod def get_str(cls, reso: "Resolution") -> str: """ diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index 21f4b3f8bb76a..210825809e58c 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -363,19 +363,19 @@ def _format_attrs(self): # -------------------------------------------------------------------- # Indexing Methods - def _validate_partial_date_slice(self, reso: str): + def _validate_partial_date_slice(self, reso: Resolution): raise NotImplementedError - def _parsed_string_to_bounds(self, reso: str, parsed: datetime): + def _parsed_string_to_bounds(self, reso: Resolution, parsed: datetime): raise NotImplementedError def _partial_date_slice( - self, reso: str, parsed: datetime, use_lhs: bool = True, use_rhs: bool = True + self, reso: Resolution, parsed: datetime, use_lhs: bool = True, use_rhs: bool = True ): """ Parameters ---------- - reso : str + reso : Resolution parsed : datetime use_lhs : bool, default True use_rhs : bool, default True diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 4677faa6b7d24..2947c5b16bb32 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -7,7 +7,6 @@ from pandas._libs import NaT, Period, Timestamp, index as libindex, lib, tslib 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 from pandas.util._decorators import cache_readonly @@ -472,7 +471,7 @@ def snap(self, freq="S"): dta = DatetimeArray(snapped, dtype=self.dtype) return DatetimeIndex._simple_new(dta, name=self.name) - def _parsed_string_to_bounds(self, reso: str, parsed: datetime): + def _parsed_string_to_bounds(self, reso: Resolution, parsed: datetime): """ Calculate datetime bounds for parsed time string and its resolution. @@ -487,6 +486,7 @@ def _parsed_string_to_bounds(self, reso: str, parsed: datetime): ------- lower, upper: pd.Timestamp """ + assert isinstance(reso, Resolution), (type(reso), reso) valid_resos = { "year", "month", @@ -499,10 +499,10 @@ def _parsed_string_to_bounds(self, reso: str, parsed: datetime): "second", "microsecond", } - if reso not in valid_resos: + if reso.get_str(reso) not in valid_resos: raise KeyError - grp = get_freq_group(reso) + grp = reso.freq_group per = Period(parsed, freq=(grp, 1)) start, end = per.start_time, per.end_time @@ -523,11 +523,12 @@ def _parsed_string_to_bounds(self, reso: str, parsed: datetime): end = end.tz_localize(self.tz) return start, end - def _validate_partial_date_slice(self, reso: str): + def _validate_partial_date_slice(self, reso: Resolution): + assert isinstance(reso, Resolution), (type(reso), reso) if ( self.is_monotonic - and reso in ["day", "hour", "minute", "second"] - and self._resolution_obj >= Resolution.from_attrname(reso) + and reso.get_str(reso) in ["day", "hour", "minute", "second"] + and self._resolution_obj >= reso ): # These resolution/monotonicity validations came from GH3931, # GH3452 and GH2369. @@ -627,6 +628,7 @@ def _maybe_cast_slice_bound(self, label, side: str, kind): if isinstance(label, str): freq = getattr(self, "freqstr", getattr(self, "inferred_freq", None)) parsed, reso = parsing.parse_time_string(label, freq) + reso = Resolution.from_attrname(reso) lower, upper = self._parsed_string_to_bounds(reso, parsed) # lower, upper form the half-open interval: # [parsed, parsed + 1 freq) @@ -643,6 +645,7 @@ def _maybe_cast_slice_bound(self, label, side: str, kind): def _get_string_slice(self, key: str, use_lhs: bool = True, use_rhs: bool = True): freq = getattr(self, "freqstr", getattr(self, "inferred_freq", None)) parsed, reso = parsing.parse_time_string(key, freq) + reso = Resolution.from_attrname(reso) loc = self._partial_date_slice(reso, parsed, use_lhs=use_lhs, use_rhs=use_rhs) return loc diff --git a/pandas/core/indexes/period.py b/pandas/core/indexes/period.py index 14922000c9707..dedf21524a739 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 +from pandas._libs.tslibs import Period, Resolution from pandas._libs.tslibs.frequencies import get_freq_group from pandas._libs.tslibs.parsing import DateParseError, parse_time_string from pandas._typing import DtypeObj, Label @@ -501,7 +501,8 @@ def get_loc(self, key, method=None, tolerance=None): # A string with invalid format raise KeyError(f"Cannot interpret '{key}' as period") from err - grp = get_freq_group(reso) + reso = Resolution.from_attrname(reso) + grp = reso.freq_group freqn = get_freq_group(self.freq) # _get_string_slice will handle cases where grp < freqn @@ -558,6 +559,7 @@ def _maybe_cast_slice_bound(self, label, side: str, kind: str): elif isinstance(label, str): try: parsed, reso = parse_time_string(label, self.freq) + reso = Resolution.from_attrname(reso) bounds = self._parsed_string_to_bounds(reso, parsed) return bounds[0 if side == "left" else 1] except ValueError as err: @@ -569,16 +571,18 @@ def _maybe_cast_slice_bound(self, label, side: str, kind: str): return label - def _parsed_string_to_bounds(self, reso: str, parsed: datetime): - if reso not in ["year", "month", "quarter", "day", "hour", "minute", "second"]: - raise KeyError(reso) + def _parsed_string_to_bounds(self, reso: Resolution, parsed: datetime): + assert isinstance(reso, Resolution), (type(reso), reso) + #if reso not in ["year", "month", "quarter", "day", "hour", "minute", "second"]: + # raise KeyError(reso) - grp = get_freq_group(reso) + grp = reso.freq_group iv = Period(parsed, freq=(grp, 1)) return (iv.asfreq(self.freq, how="start"), iv.asfreq(self.freq, how="end")) - def _validate_partial_date_slice(self, reso: str): - grp = get_freq_group(reso) + def _validate_partial_date_slice(self, reso: Resolution): + assert isinstance(reso, Resolution), (type(reso), reso) + grp = reso.freq_group freqn = get_freq_group(self.freq) if not grp < freqn: @@ -590,7 +594,7 @@ def _validate_partial_date_slice(self, reso: str): def _get_string_slice(self, key: str, use_lhs: bool = True, use_rhs: bool = True): # TODO: Check for non-True use_lhs/use_rhs parsed, reso = parse_time_string(key, self.freq) - + reso = Resolution.from_attrname(reso) try: return self._partial_date_slice(reso, parsed, use_lhs, use_rhs) except KeyError as err: diff --git a/pandas/tests/indexes/period/test_ops.py b/pandas/tests/indexes/period/test_ops.py index fc44226f9d72f..22216f5ff0898 100644 --- a/pandas/tests/indexes/period/test_ops.py +++ b/pandas/tests/indexes/period/test_ops.py @@ -7,24 +7,22 @@ class TestPeriodIndexOps: - def test_resolution(self): - for freq, expected in zip( - ["A", "Q", "M", "D", "H", "T", "S", "L", "U"], - [ - "day", - "day", - "day", - "day", - "hour", - "minute", - "second", - "millisecond", - "microsecond", - ], - ): - - idx = pd.period_range(start="2013-04-01", periods=30, freq=freq) - assert idx.resolution == expected + @pytest.mark.parametrize("freq,expected", + [ + ("A", "day"), + ("Q", "day"), + ("M", "day"), + ("D", "day"), + ("H", "hour"), + ("T", "minute"), + ("S", "second"), + ("L", "millisecond"), + ("U", "microsecond"), + ] + ) + def test_resolution(self, freq, expected): + idx = pd.period_range(start="2013-04-01", periods=30, freq=freq) + assert idx.resolution == expected def test_value_counts_unique(self): # GH 7735 From ffe0d95bced9cfa5b3cd100a6a3807389243eec3 Mon Sep 17 00:00:00 2001 From: Brock Date: Tue, 2 Jun 2020 15:27:56 -0700 Subject: [PATCH 2/7] restore --- pandas/_libs/tslibs/resolution.pyx | 10 +++++----- pandas/core/indexes/datetimes.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pandas/_libs/tslibs/resolution.pyx b/pandas/_libs/tslibs/resolution.pyx index 2077152c8dc8b..7ded127b1b191 100644 --- a/pandas/_libs/tslibs/resolution.pyx +++ b/pandas/_libs/tslibs/resolution.pyx @@ -27,7 +27,7 @@ cdef: int RESO_MIN = 4 int RESO_HR = 5 int RESO_DAY = 6 - #int RESO_MTH = 7 + int RESO_MTH = 7 int RESO_QTR = 8 int RESO_YR = 9 @@ -41,7 +41,7 @@ _reso_str_map = { RESO_MIN: "minute", RESO_HR: "hour", RESO_DAY: "day", - #RESO_MTH: "month", + RESO_MTH: "month", RESO_QTR: "quarter", RESO_YR: "year", } @@ -133,7 +133,7 @@ class Resolution(Enum): RESO_MIN = 4 RESO_HR = 5 RESO_DAY = 6 - #RESO_MTH = 7 + RESO_MTH = 7 RESO_QTR = 8 RESO_YR = 9 @@ -160,8 +160,8 @@ class Resolution(Enum): return FreqGroup.FR_HR if self == Resolution.RESO_DAY: return FreqGroup.FR_DAY - #if self == Resolution.RESO_MTH: - # return FreqGroup.FR_MTH + if self == Resolution.RESO_MTH: + return FreqGroup.FR_MTH if self == Resolution.RESO_QTR: return FreqGroup.FR_QTR if self == Resolution.RESO_YR: diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 2947c5b16bb32..056f7d69cedc8 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -499,7 +499,7 @@ def _parsed_string_to_bounds(self, reso: Resolution, parsed: datetime): "second", "microsecond", } - if reso.get_str(reso) not in valid_resos: + if reso.attrname not in valid_resos: raise KeyError grp = reso.freq_group @@ -527,7 +527,7 @@ def _validate_partial_date_slice(self, reso: Resolution): assert isinstance(reso, Resolution), (type(reso), reso) if ( self.is_monotonic - and reso.get_str(reso) in ["day", "hour", "minute", "second"] + and reso.attrname in ["day", "hour", "minute", "second"] and self._resolution_obj >= reso ): # These resolution/monotonicity validations came from GH3931, From cf71c6bda051ad3e60e10ec16589a46f0ef993e4 Mon Sep 17 00:00:00 2001 From: Brock Date: Thu, 4 Jun 2020 17:50:12 -0700 Subject: [PATCH 3/7] ENH: Resolutions for month/qtr/year --- pandas/_libs/tslibs/resolution.pyx | 16 ++++++++++++++-- pandas/core/arrays/datetimelike.py | 5 ----- pandas/tests/indexes/period/test_ops.py | 6 +++--- .../tests/tseries/frequencies/test_freq_code.py | 10 +++------- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/pandas/_libs/tslibs/resolution.pyx b/pandas/_libs/tslibs/resolution.pyx index 7ded127b1b191..a33315b7ac224 100644 --- a/pandas/_libs/tslibs/resolution.pyx +++ b/pandas/_libs/tslibs/resolution.pyx @@ -11,7 +11,7 @@ from pandas._libs.tslibs.frequencies cimport attrname_to_abbrevs from pandas._libs.tslibs.frequencies import FreqGroup from pandas._libs.tslibs.timezones cimport ( is_utc, is_tzlocal, maybe_get_tz, get_dst_info) -from pandas._libs.tslibs.ccalendar cimport get_days_in_month +from pandas._libs.tslibs.ccalendar cimport get_days_in_month, c_MONTH_NUMBERS from pandas._libs.tslibs.tzconversion cimport tz_convert_utc_to_tzlocal # ---------------------------------------------------------------------- @@ -210,7 +210,19 @@ class Resolution(Enum): >>> Resolution.get_reso_from_freq('H') == Resolution.RESO_HR True """ - attr_name = _abbrev_to_attrnames[freq] + try: + attr_name = _abbrev_to_attrnames[freq] + except KeyError: + # For quarterly and yearly resolutions, we need to chop off + # a month string. + split_freq = freq.split("-") + if len(split_freq) != 2: + raise + if split_freq[1] not in c_MONTH_NUMBERS: + # i.e. we want e.g. "Q-DEC", not "Q-INVALID" + raise + attr_name = _abbrev_to_attrnames[split_freq[0]] + return cls.from_attrname(attr_name) diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index e2ecb6c343b7a..8af23815b54ef 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -1122,11 +1122,6 @@ def resolution(self) -> str: """ Returns day, hour, minute, second, millisecond or microsecond """ - 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 self._resolution_obj.attrname # type: ignore @classmethod diff --git a/pandas/tests/indexes/period/test_ops.py b/pandas/tests/indexes/period/test_ops.py index 22216f5ff0898..a9336112b2d99 100644 --- a/pandas/tests/indexes/period/test_ops.py +++ b/pandas/tests/indexes/period/test_ops.py @@ -9,9 +9,9 @@ class TestPeriodIndexOps: @pytest.mark.parametrize("freq,expected", [ - ("A", "day"), - ("Q", "day"), - ("M", "day"), + ("A", "year"), + ("Q", "quarter"), + ("M", "month"), ("D", "day"), ("H", "hour"), ("T", "minute"), diff --git a/pandas/tests/tseries/frequencies/test_freq_code.py b/pandas/tests/tseries/frequencies/test_freq_code.py index d4eb31168b20e..2318619a5c734 100644 --- a/pandas/tests/tseries/frequencies/test_freq_code.py +++ b/pandas/tests/tseries/frequencies/test_freq_code.py @@ -93,6 +93,9 @@ def test_get_to_timestamp_base(freqstr, exp_freqstr): @pytest.mark.parametrize( "freqstr,expected", [ + ("A", "year"), + ("Q", "quarter"), + ("M", "month"), ("D", "day"), ("H", "hour"), ("T", "minute"), @@ -106,13 +109,6 @@ def test_get_attrname_from_abbrev(freqstr, expected): assert _reso.get_reso_from_freq(freqstr).attrname == expected -@pytest.mark.parametrize("freq", ["A", "Q", "M"]) -def test_get_freq_unsupported_(freq): - # Lowest-frequency resolution is for Day - with pytest.raises(KeyError, match=freq.lower()): - _reso.get_reso_from_freq(freq) - - @pytest.mark.parametrize("freq", ["D", "H", "T", "S", "L", "U", "N"]) def test_get_freq_roundtrip2(freq): obj = _reso.get_reso_from_freq(freq) From a04be73ff28f13cc58bdd176aa0f8ee7dbd32fe3 Mon Sep 17 00:00:00 2001 From: Brock Date: Thu, 4 Jun 2020 17:53:05 -0700 Subject: [PATCH 4/7] revert comments --- pandas/_libs/tslibs/parsing.pyx | 2 +- pandas/_libs/tslibs/period.pyx | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pandas/_libs/tslibs/parsing.pyx b/pandas/_libs/tslibs/parsing.pyx index 8d523f01151e9..3a1af9fdb1e8f 100644 --- a/pandas/_libs/tslibs/parsing.pyx +++ b/pandas/_libs/tslibs/parsing.pyx @@ -386,7 +386,7 @@ cdef inline object _parse_dateabbr_string(object date_string, datetime default, assert isinstance(date_string, str) if date_string in nat_strings: - return NaT, '' # TODO: reso str here? + return NaT, '' date_string = date_string.upper() date_len = len(date_string) diff --git a/pandas/_libs/tslibs/period.pyx b/pandas/_libs/tslibs/period.pyx index 54f5e09dd7e47..e88a20bc549bd 100644 --- a/pandas/_libs/tslibs/period.pyx +++ b/pandas/_libs/tslibs/period.pyx @@ -2427,7 +2427,6 @@ class Period(_Period): value = str(value) value = value.upper() dt, reso = parse_time_string(value, freq) - # TODO: reso = Resolution.from_attrname(reso) if dt is NaT: ordinal = NPY_NAT From c7791b99e6eb57f9ba903057f31ee188b228bfb8 Mon Sep 17 00:00:00 2001 From: Brock Date: Thu, 4 Jun 2020 17:54:21 -0700 Subject: [PATCH 5/7] remove commented-out --- pandas/core/indexes/period.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pandas/core/indexes/period.py b/pandas/core/indexes/period.py index dedf21524a739..d1a112dece37c 100644 --- a/pandas/core/indexes/period.py +++ b/pandas/core/indexes/period.py @@ -572,10 +572,6 @@ def _maybe_cast_slice_bound(self, label, side: str, kind: str): return label def _parsed_string_to_bounds(self, reso: Resolution, parsed: datetime): - assert isinstance(reso, Resolution), (type(reso), reso) - #if reso not in ["year", "month", "quarter", "day", "hour", "minute", "second"]: - # raise KeyError(reso) - grp = reso.freq_group iv = Period(parsed, freq=(grp, 1)) return (iv.asfreq(self.freq, how="start"), iv.asfreq(self.freq, how="end")) From b23b11f4924ab685473374ec56127ec41b738951 Mon Sep 17 00:00:00 2001 From: Brock Date: Thu, 4 Jun 2020 18:00:53 -0700 Subject: [PATCH 6/7] blackify --- pandas/core/indexes/datetimelike.py | 6 +++++- pandas/tests/indexes/period/test_ops.py | 5 +++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index 210825809e58c..ca6eb45e22c69 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -370,7 +370,11 @@ def _parsed_string_to_bounds(self, reso: Resolution, parsed: datetime): raise NotImplementedError def _partial_date_slice( - self, reso: Resolution, parsed: datetime, use_lhs: bool = True, use_rhs: bool = True + self, + reso: Resolution, + parsed: datetime, + use_lhs: bool = True, + use_rhs: bool = True, ): """ Parameters diff --git a/pandas/tests/indexes/period/test_ops.py b/pandas/tests/indexes/period/test_ops.py index a9336112b2d99..e7dd76584d780 100644 --- a/pandas/tests/indexes/period/test_ops.py +++ b/pandas/tests/indexes/period/test_ops.py @@ -7,7 +7,8 @@ class TestPeriodIndexOps: - @pytest.mark.parametrize("freq,expected", + @pytest.mark.parametrize( + "freq,expected", [ ("A", "year"), ("Q", "quarter"), @@ -18,7 +19,7 @@ class TestPeriodIndexOps: ("S", "second"), ("L", "millisecond"), ("U", "microsecond"), - ] + ], ) def test_resolution(self, freq, expected): idx = pd.period_range(start="2013-04-01", periods=30, freq=freq) From 4cd45faedc921d2e63575d32dc54be49119d6750 Mon Sep 17 00:00:00 2001 From: Brock Date: Tue, 9 Jun 2020 14:05:59 -0700 Subject: [PATCH 7/7] if -> elif --- pandas/_libs/tslibs/resolution.pyx | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/pandas/_libs/tslibs/resolution.pyx b/pandas/_libs/tslibs/resolution.pyx index a33315b7ac224..7453933ddbb4f 100644 --- a/pandas/_libs/tslibs/resolution.pyx +++ b/pandas/_libs/tslibs/resolution.pyx @@ -148,25 +148,26 @@ class Resolution(Enum): # TODO: annotate as returning FreqGroup once that is an enum if self == Resolution.RESO_NS: return FreqGroup.FR_NS - if self == Resolution.RESO_US: + elif self == Resolution.RESO_US: return FreqGroup.FR_US - if self == Resolution.RESO_MS: + elif self == Resolution.RESO_MS: return FreqGroup.FR_MS - if self == Resolution.RESO_SEC: + elif self == Resolution.RESO_SEC: return FreqGroup.FR_SEC - if self == Resolution.RESO_MIN: + elif self == Resolution.RESO_MIN: return FreqGroup.FR_MIN - if self == Resolution.RESO_HR: + elif self == Resolution.RESO_HR: return FreqGroup.FR_HR - if self == Resolution.RESO_DAY: + elif self == Resolution.RESO_DAY: return FreqGroup.FR_DAY - if self == Resolution.RESO_MTH: + elif self == Resolution.RESO_MTH: return FreqGroup.FR_MTH - if self == Resolution.RESO_QTR: + elif self == Resolution.RESO_QTR: return FreqGroup.FR_QTR - if self == Resolution.RESO_YR: + elif self == Resolution.RESO_YR: return FreqGroup.FR_ANN - raise ValueError(self) + else: + raise ValueError(self) @property def attrname(self) -> str: