Skip to content

Commit 5a0ea7a

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

File tree

4 files changed

+88
-55
lines changed

4 files changed

+88
-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

+73-51
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,70 @@ 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+
4713+
if name in c_PERIOD_AND_OFFSET_DEPR_FREQSTR:
4714+
warnings.warn(
4715+
f"\'{name}\' is deprecated and will be removed "
4716+
f"in a future version, please use "
4717+
f"\'{c_PERIOD_AND_OFFSET_DEPR_FREQSTR.get(name)}\' "
4718+
f" instead.",
4719+
FutureWarning,
4720+
stacklevel=find_stack_level(),
4721+
)
4722+
return c_PERIOD_AND_OFFSET_DEPR_FREQSTR[name]
4723+
4724+
if not is_period and name in c_OFFSET_RENAMED_FREQSTR:
4725+
warnings.warn(
4726+
f"\'{name}\' is deprecated and will be removed "
4727+
f"in a future version, please use "
4728+
f"\'{c_OFFSET_RENAMED_FREQSTR[name]}\' "
4729+
f" instead.",
4730+
FutureWarning,
4731+
stacklevel=find_stack_level(),
4732+
)
4733+
return c_OFFSET_RENAMED_FREQSTR[name]
4734+
4735+
for _name in (name.lower(), name.upper()):
4736+
if name == _name:
4737+
continue
4738+
if _name in c_PERIOD_AND_OFFSET_DEPR_FREQSTR.values():
4739+
warnings.warn(
4740+
f"\'{name}\' is deprecated and will be removed "
4741+
f"in a future version, please use "
4742+
f"\'{_name}\' "
4743+
f" instead.",
4744+
FutureWarning,
4745+
stacklevel=find_stack_level(),
4746+
)
4747+
return _name
4748+
if (
4749+
not is_period
4750+
and _name in c_OFFSET_RENAMED_FREQSTR.values()
4751+
):
4752+
warnings.warn(
4753+
f"\'{name}\' is deprecated and will be removed "
4754+
f"in a future version, please use "
4755+
f"\'{_name}\' "
4756+
f" instead.",
4757+
FutureWarning,
4758+
stacklevel=find_stack_level(),
4759+
)
4760+
return _name
4761+
if _name in _lite_rule_alias and name != _name:
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+
4772+
return name
4773+
4774+
47154775
def _validate_to_offset_alias(alias: str, is_period: bool) -> None:
47164776
if not is_period:
47174777
if alias.upper() in c_OFFSET_RENAMED_FREQSTR:
@@ -4749,35 +4809,6 @@ def _get_offset(name: str) -> BaseOffset:
47494809
--------
47504810
_get_offset('EOM') --> BMonthEnd(1)
47514811
"""
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-
47814812
if name not in _offset_map:
47824813
try:
47834814
split = name.split("-")
@@ -4879,39 +4910,30 @@ cpdef to_offset(freq, bint is_period=False):
48794910

48804911
tups = zip(split[0::4], split[1::4], split[2::4])
48814912
for n, (sep, stride, name) in enumerate(tups):
4913+
name = _warn_about_deprecated_aliases(name, is_period)
48824914
_validate_to_offset_alias(name, is_period)
4915+
name = _lite_rule_alias.get(name, name)
48834916
if is_period:
48844917
if name.upper() in c_PERIOD_TO_OFFSET_FREQSTR:
48854918
if name.upper() != name:
48864919
raise ValueError(
48874920
f"\'{name}\' is no longer supported, "
48884921
f"please use \'{name.upper()}\' instead.",
48894922
)
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)
4923+
name = c_PERIOD_TO_OFFSET_FREQSTR[name.upper()]
4924+
49024925
if sep != "" and not sep.isspace():
49034926
raise ValueError("separator must be spaces")
4904-
prefix = _lite_rule_alias.get(name) or name
49054927
if stride_sign is None:
49064928
stride_sign = -1 if stride.startswith("-") else 1
49074929
if not stride:
49084930
stride = 1
49094931

4910-
if prefix in {"D", "h", "min", "s", "ms", "us", "ns"}:
4932+
if name in {"D", "h", "min", "s", "ms", "us", "ns"}:
49114933
# For these prefixes, we have something like "3h" or
49124934
# "2.5min", so we can construct a Timedelta with the
49134935
# matching unit and get our offset from delta_to_tick
4914-
td = Timedelta(1, unit=prefix)
4936+
td = Timedelta(1, unit=name)
49154937
off = delta_to_tick(td)
49164938
offset = off * float(stride)
49174939
if n != 0:
@@ -4920,7 +4942,7 @@ cpdef to_offset(freq, bint is_period=False):
49204942
offset *= stride_sign
49214943
else:
49224944
stride = int(stride)
4923-
offset = _get_offset(prefix)
4945+
offset = _get_offset(name)
49244946
offset = offset * int(np.fabs(stride) * stride_sign)
49254947

49264948
if result is None:
@@ -4930,7 +4952,7 @@ cpdef to_offset(freq, bint is_period=False):
49304952
except (ValueError, TypeError) as err:
49314953
raise ValueError(INVALID_FREQ_ERR_MSG.format(
49324954
f"{freq}, failed to parse with error message: {repr(err)}")
4933-
)
4955+
) from err
49344956
else:
49354957
result = None
49364958

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)