Skip to content

Commit 35af7ed

Browse files
committed
clean: simplify lite-rule-alias and dont-uppercase
1 parent 1165859 commit 35af7ed

File tree

4 files changed

+97
-62
lines changed

4 files changed

+97
-62
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

+82-58
Original file line numberDiff line numberDiff line change
@@ -4696,13 +4696,9 @@ _lite_rule_alias = {
46964696
"BYS": "BYS-JAN", # BYearBegin(month=1),
46974697

46984698
"Min": "min",
4699-
"min": "min",
4700-
"ms": "ms",
4701-
"us": "us",
4702-
"ns": "ns",
47034699
}
47044700

4705-
_dont_uppercase = {"h", "bh", "cbh", "MS", "ms", "s"}
4701+
_dont_uppercase = {"min", "h", "bh", "cbh", "s", "ms", "us", "ns"}
47064702

47074703

47084704
INVALID_FREQ_ERR_MSG = "Invalid frequency: {0}"
@@ -4712,6 +4708,80 @@ INVALID_FREQ_ERR_MSG = "Invalid frequency: {0}"
47124708
_offset_map = {}
47134709

47144710

4711+
def _warn_about_deprecated_aliases(name: str, is_period: bool) -> str:
4712+
if name == "Min":
4713+
# Not deprecated (yet? should it be?)
4714+
return "min"
4715+
if is_period:
4716+
if name.upper() in c_PERIOD_TO_OFFSET_FREQSTR:
4717+
if name.upper() != name:
4718+
raise ValueError(
4719+
f"\'{name}\' is no longer supported, "
4720+
f"please use \'{name.upper()}\' instead.",
4721+
)
4722+
return c_PERIOD_TO_OFFSET_FREQSTR[name.upper()]
4723+
4724+
if name in c_PERIOD_AND_OFFSET_DEPR_FREQSTR:
4725+
warnings.warn(
4726+
f"\'{name}\' is deprecated and will be removed "
4727+
f"in a future version, please use "
4728+
f"\'{c_PERIOD_AND_OFFSET_DEPR_FREQSTR.get(name)}\' "
4729+
f" instead.",
4730+
FutureWarning,
4731+
stacklevel=find_stack_level(),
4732+
)
4733+
return c_PERIOD_AND_OFFSET_DEPR_FREQSTR[name]
4734+
4735+
if not is_period and name in c_OFFSET_RENAMED_FREQSTR:
4736+
warnings.warn(
4737+
f"\'{name}\' is deprecated and will be removed "
4738+
f"in a future version, please use "
4739+
f"\'{c_OFFSET_RENAMED_FREQSTR[name]}\' "
4740+
f" instead.",
4741+
FutureWarning,
4742+
stacklevel=find_stack_level(),
4743+
)
4744+
return c_OFFSET_RENAMED_FREQSTR[name]
4745+
4746+
for _name in (name.lower(), name.upper()):
4747+
if name != _name and _name in c_PERIOD_AND_OFFSET_DEPR_FREQSTR.values():
4748+
warnings.warn(
4749+
f"\'{name}\' is deprecated and will be removed "
4750+
f"in a future version, please use "
4751+
f"\'{_name}\' "
4752+
f" instead.",
4753+
FutureWarning,
4754+
stacklevel=find_stack_level(),
4755+
)
4756+
return _name
4757+
if (
4758+
not is_period
4759+
and name != _name
4760+
and _name in c_OFFSET_RENAMED_FREQSTR.values()
4761+
):
4762+
warnings.warn(
4763+
f"\'{name}\' is deprecated and will be removed "
4764+
f"in a future version, please use "
4765+
f"\'{_name}\' "
4766+
f" instead.",
4767+
FutureWarning,
4768+
stacklevel=find_stack_level(),
4769+
)
4770+
return _name
4771+
if _name in _lite_rule_alias and name != _name:
4772+
warnings.warn(
4773+
f"\'{name}\' is deprecated and will be removed "
4774+
f"in a future version, please use "
4775+
f"\'{_name}\' "
4776+
f" instead.",
4777+
FutureWarning,
4778+
stacklevel=find_stack_level(),
4779+
)
4780+
return _name
4781+
4782+
return name
4783+
4784+
47154785
def _validate_to_offset_alias(alias: str, is_period: bool) -> None:
47164786
if not is_period:
47174787
if alias.upper() in c_OFFSET_RENAMED_FREQSTR:
@@ -4749,35 +4819,6 @@ def _get_offset(name: str) -> BaseOffset:
47494819
--------
47504820
_get_offset('EOM') --> BMonthEnd(1)
47514821
"""
4752-
if (
4753-
name not in _lite_rule_alias
4754-
and (name.upper() in _lite_rule_alias)
4755-
and name != "ms"
4756-
):
4757-
warnings.warn(
4758-
f"\'{name}\' is deprecated and will be removed "
4759-
f"in a future version, please use \'{name.upper()}\' instead.",
4760-
FutureWarning,
4761-
stacklevel=find_stack_level(),
4762-
)
4763-
elif (
4764-
name not in _lite_rule_alias
4765-
and (name.lower() in _lite_rule_alias)
4766-
and name != "MS"
4767-
):
4768-
warnings.warn(
4769-
f"\'{name}\' is deprecated and will be removed "
4770-
f"in a future version, please use \'{name.lower()}\' instead.",
4771-
FutureWarning,
4772-
stacklevel=find_stack_level(),
4773-
)
4774-
if name not in _dont_uppercase:
4775-
name = name.upper()
4776-
name = _lite_rule_alias.get(name, name)
4777-
name = _lite_rule_alias.get(name.lower(), name)
4778-
else:
4779-
name = _lite_rule_alias.get(name, name)
4780-
47814822
if name not in _offset_map:
47824823
try:
47834824
split = name.split("-")
@@ -4880,38 +4921,21 @@ cpdef to_offset(freq, bint is_period=False):
48804921
tups = zip(split[0::4], split[1::4], split[2::4])
48814922
for n, (sep, stride, name) in enumerate(tups):
48824923
_validate_to_offset_alias(name, is_period)
4883-
if is_period:
4884-
if name.upper() in c_PERIOD_TO_OFFSET_FREQSTR:
4885-
if name.upper() != name:
4886-
raise ValueError(
4887-
f"\'{name}\' is no longer supported, "
4888-
f"please use \'{name.upper()}\' instead.",
4889-
)
4890-
name = c_PERIOD_TO_OFFSET_FREQSTR.get(name.upper())
4891-
4892-
if name in c_PERIOD_AND_OFFSET_DEPR_FREQSTR:
4893-
warnings.warn(
4894-
f"\'{name}\' is deprecated and will be removed "
4895-
f"in a future version, please use "
4896-
f"\'{c_PERIOD_AND_OFFSET_DEPR_FREQSTR.get(name)}\' "
4897-
f" instead.",
4898-
FutureWarning,
4899-
stacklevel=find_stack_level(),
4900-
)
4901-
name = c_PERIOD_AND_OFFSET_DEPR_FREQSTR.get(name)
4924+
name = _warn_about_deprecated_aliases(name, is_period)
4925+
name = _lite_rule_alias.get(name, name)
4926+
49024927
if sep != "" and not sep.isspace():
49034928
raise ValueError("separator must be spaces")
4904-
prefix = _lite_rule_alias.get(name) or name
49054929
if stride_sign is None:
49064930
stride_sign = -1 if stride.startswith("-") else 1
49074931
if not stride:
49084932
stride = 1
49094933

4910-
if prefix in {"D", "h", "min", "s", "ms", "us", "ns"}:
4934+
if name in {"D", "h", "min", "s", "ms", "us", "ns"}:
49114935
# For these prefixes, we have something like "3h" or
49124936
# "2.5min", so we can construct a Timedelta with the
49134937
# matching unit and get our offset from delta_to_tick
4914-
td = Timedelta(1, unit=prefix)
4938+
td = Timedelta(1, unit=name)
49154939
off = delta_to_tick(td)
49164940
offset = off * float(stride)
49174941
if n != 0:
@@ -4920,7 +4944,7 @@ cpdef to_offset(freq, bint is_period=False):
49204944
offset *= stride_sign
49214945
else:
49224946
stride = int(stride)
4923-
offset = _get_offset(prefix)
4947+
offset = _get_offset(name)
49244948
offset = offset * int(np.fabs(stride) * stride_sign)
49254949

49264950
if result is None:
@@ -4930,7 +4954,7 @@ cpdef to_offset(freq, bint is_period=False):
49304954
except (ValueError, TypeError) as err:
49314955
raise ValueError(INVALID_FREQ_ERR_MSG.format(
49324956
f"{freq}, failed to parse with error message: {repr(err)}")
4933-
)
4957+
) from err
49344958
else:
49354959
result = None
49364960

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

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

789789
pairs = [
790790
("B", BDay()),
791-
("b", BDay()),
792-
("bme", BMonthEnd()),
793-
("Bme", BMonthEnd()),
794791
("W-MON", Week(weekday=0)),
795792
("W-TUE", Week(weekday=1)),
796793
("W-WED", Week(weekday=2)),
@@ -804,6 +801,18 @@ def test_get_offset():
804801
offset == expected
805802
), f"Expected {name!r} to yield {expected!r} (actual: {offset!r})"
806803

804+
pairs = [
805+
("b", BDay()),
806+
("bme", BMonthEnd()),
807+
]
808+
809+
for name, expected in pairs:
810+
with tm.assert_produces_warning(FutureWarning, match=f"'{name}' is deprecated"):
811+
offset = to_offset(name)
812+
assert (
813+
offset == expected
814+
), f"Expected {name!r} to yield {expected!r} (actual: {offset!r})"
815+
807816

808817
def test_get_offset_legacy():
809818
pairs = [("w@Sat", Week(weekday=5))]

0 commit comments

Comments
 (0)