Skip to content

Commit fe9ff74

Browse files
authored
clean: simplify lite-rule-alias and dont-uppercase (#59240)
1 parent 5a6025c commit fe9ff74

File tree

4 files changed

+44
-55
lines changed

4 files changed

+44
-55
lines changed

pandas/_libs/tslibs/dtypes.pyx

+2
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,8 @@ cdef dict c_PERIOD_AND_OFFSET_DEPR_FREQSTR = {
359359
"b": "B",
360360
"c": "C",
361361
"MIN": "min",
362+
"US": "us",
363+
"NS": "ns",
362364
}
363365

364366
cdef str INVALID_FREQ_ERR_MSG = "Invalid frequency: {0}"

pandas/_libs/tslibs/offsets.pyx

+40-51
Original file line numberDiff line numberDiff line change
@@ -4697,13 +4697,9 @@ _lite_rule_alias = {
46974697
"BYS": "BYS-JAN", # BYearBegin(month=1),
46984698

46994699
"Min": "min",
4700-
"min": "min",
4701-
"ms": "ms",
4702-
"us": "us",
4703-
"ns": "ns",
47044700
}
47054701

4706-
_dont_uppercase = {"h", "bh", "cbh", "MS", "ms", "s"}
4702+
_dont_uppercase = {"min", "h", "bh", "cbh", "s", "ms", "us", "ns"}
47074703

47084704

47094705
INVALID_FREQ_ERR_MSG = "Invalid frequency: {0}"
@@ -4713,6 +4709,37 @@ INVALID_FREQ_ERR_MSG = "Invalid frequency: {0}"
47134709
_offset_map = {}
47144710

47154711

4712+
def _warn_about_deprecated_aliases(name: str, is_period: bool) -> str:
4713+
if name in _lite_rule_alias:
4714+
return name
4715+
if name in c_PERIOD_AND_OFFSET_DEPR_FREQSTR:
4716+
warnings.warn(
4717+
f"\'{name}\' is deprecated and will be removed "
4718+
f"in a future version, please use "
4719+
f"\'{c_PERIOD_AND_OFFSET_DEPR_FREQSTR.get(name)}\' "
4720+
f" instead.",
4721+
FutureWarning,
4722+
stacklevel=find_stack_level(),
4723+
)
4724+
return c_PERIOD_AND_OFFSET_DEPR_FREQSTR[name]
4725+
4726+
for _name in (name.lower(), name.upper()):
4727+
if name == _name:
4728+
continue
4729+
if _name in c_PERIOD_AND_OFFSET_DEPR_FREQSTR.values():
4730+
warnings.warn(
4731+
f"\'{name}\' is deprecated and will be removed "
4732+
f"in a future version, please use "
4733+
f"\'{_name}\' "
4734+
f" instead.",
4735+
FutureWarning,
4736+
stacklevel=find_stack_level(),
4737+
)
4738+
return _name
4739+
4740+
return name
4741+
4742+
47164743
def _validate_to_offset_alias(alias: str, is_period: bool) -> None:
47174744
if not is_period:
47184745
if alias.upper() in c_OFFSET_RENAMED_FREQSTR:
@@ -4750,35 +4777,6 @@ def _get_offset(name: str) -> BaseOffset:
47504777
--------
47514778
_get_offset('EOM') --> BMonthEnd(1)
47524779
"""
4753-
if (
4754-
name not in _lite_rule_alias
4755-
and (name.upper() in _lite_rule_alias)
4756-
and name != "ms"
4757-
):
4758-
warnings.warn(
4759-
f"\'{name}\' is deprecated and will be removed "
4760-
f"in a future version, please use \'{name.upper()}\' instead.",
4761-
FutureWarning,
4762-
stacklevel=find_stack_level(),
4763-
)
4764-
elif (
4765-
name not in _lite_rule_alias
4766-
and (name.lower() in _lite_rule_alias)
4767-
and name != "MS"
4768-
):
4769-
warnings.warn(
4770-
f"\'{name}\' is deprecated and will be removed "
4771-
f"in a future version, please use \'{name.lower()}\' instead.",
4772-
FutureWarning,
4773-
stacklevel=find_stack_level(),
4774-
)
4775-
if name not in _dont_uppercase:
4776-
name = name.upper()
4777-
name = _lite_rule_alias.get(name, name)
4778-
name = _lite_rule_alias.get(name.lower(), name)
4779-
else:
4780-
name = _lite_rule_alias.get(name, name)
4781-
47824780
if name not in _offset_map:
47834781
try:
47844782
split = name.split("-")
@@ -4880,6 +4878,7 @@ cpdef to_offset(freq, bint is_period=False):
48804878

48814879
tups = zip(split[0::4], split[1::4], split[2::4])
48824880
for n, (sep, stride, name) in enumerate(tups):
4881+
name = _warn_about_deprecated_aliases(name, is_period)
48834882
_validate_to_offset_alias(name, is_period)
48844883
if is_period:
48854884
if name.upper() in c_PERIOD_TO_OFFSET_FREQSTR:
@@ -4888,31 +4887,21 @@ cpdef to_offset(freq, bint is_period=False):
48884887
f"\'{name}\' is no longer supported, "
48894888
f"please use \'{name.upper()}\' instead.",
48904889
)
4891-
name = c_PERIOD_TO_OFFSET_FREQSTR.get(name.upper())
4892-
4893-
if name in c_PERIOD_AND_OFFSET_DEPR_FREQSTR:
4894-
warnings.warn(
4895-
f"\'{name}\' is deprecated and will be removed "
4896-
f"in a future version, please use "
4897-
f"\'{c_PERIOD_AND_OFFSET_DEPR_FREQSTR.get(name)}\' "
4898-
f"instead.",
4899-
FutureWarning,
4900-
stacklevel=find_stack_level(),
4901-
)
4902-
name = c_PERIOD_AND_OFFSET_DEPR_FREQSTR.get(name)
4890+
name = c_PERIOD_TO_OFFSET_FREQSTR[name.upper()]
4891+
name = _lite_rule_alias.get(name, name)
4892+
49034893
if sep != "" and not sep.isspace():
49044894
raise ValueError("separator must be spaces")
4905-
prefix = _lite_rule_alias.get(name) or name
49064895
if stride_sign is None:
49074896
stride_sign = -1 if stride.startswith("-") else 1
49084897
if not stride:
49094898
stride = 1
49104899

4911-
if prefix in {"D", "h", "min", "s", "ms", "us", "ns"}:
4900+
if name in {"D", "h", "min", "s", "ms", "us", "ns"}:
49124901
# For these prefixes, we have something like "3h" or
49134902
# "2.5min", so we can construct a Timedelta with the
49144903
# matching unit and get our offset from delta_to_tick
4915-
td = Timedelta(1, unit=prefix)
4904+
td = Timedelta(1, unit=name)
49164905
off = delta_to_tick(td)
49174906
offset = off * float(stride)
49184907
if n != 0:
@@ -4921,7 +4910,7 @@ cpdef to_offset(freq, bint is_period=False):
49214910
offset *= stride_sign
49224911
else:
49234912
stride = int(stride)
4924-
offset = _get_offset(prefix)
4913+
offset = _get_offset(name)
49254914
offset = offset * int(np.fabs(stride) * stride_sign)
49264915

49274916
if result is None:
@@ -4931,7 +4920,7 @@ cpdef to_offset(freq, bint is_period=False):
49314920
except (ValueError, TypeError) as err:
49324921
raise ValueError(INVALID_FREQ_ERR_MSG.format(
49334922
f"{freq}, failed to parse with error message: {repr(err)}")
4934-
)
4923+
) from err
49354924
else:
49364925
result = None
49374926

pandas/tests/arrays/test_datetimes.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,7 @@ def test_date_range_frequency_M_Q_Y_raises(self, freq):
760760
with pytest.raises(ValueError, match=msg):
761761
pd.date_range("1/1/2000", periods=4, freq=freq)
762762

763-
@pytest.mark.parametrize("freq_depr", ["2MIN", "2mS", "2Us"])
763+
@pytest.mark.parametrize("freq_depr", ["2MIN", "2nS", "2Us"])
764764
def test_date_range_uppercase_frequency_deprecated(self, freq_depr):
765765
# GH#9586, GH#54939
766766
depr_msg = f"'{freq_depr[1:]}' is deprecated and will be removed in a "

pandas/tests/tseries/offsets/test_offsets.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -788,9 +788,7 @@ def test_get_offset():
788788

789789
pairs = [
790790
("B", BDay()),
791-
("b", BDay()),
792-
("bme", BMonthEnd()),
793-
("Bme", BMonthEnd()),
791+
("BME", BMonthEnd()),
794792
("W-MON", Week(weekday=0)),
795793
("W-TUE", Week(weekday=1)),
796794
("W-WED", Week(weekday=2)),

0 commit comments

Comments
 (0)