diff --git a/pandas/tests/tseries/frequencies/test_frequencies.py b/pandas/tests/tseries/frequencies/test_frequencies.py index f0af290b2fb69..ebf3f5c697c9d 100644 --- a/pandas/tests/tseries/frequencies/test_frequencies.py +++ b/pandas/tests/tseries/frequencies/test_frequencies.py @@ -2,6 +2,8 @@ from pandas._libs.tslibs import offsets +import pandas as pd + from pandas.tseries.frequencies import ( is_subperiod, is_superperiod, @@ -27,3 +29,9 @@ def test_super_sub_symmetry(p1, p2, expected): assert is_superperiod(p1, p2) is expected assert is_subperiod(p2, p1) is expected + + +def test_deprecated_freq_alias_error(): + # GH#62259 + with pytest.raises(ValueError, match="Invalid frequency 'H'.*Did you mean 'h'?"): + pd.date_range("2012-01-01", periods=3, freq="H") diff --git a/pandas/tseries/frequencies.py b/pandas/tseries/frequencies.py index 88ea1bfa3c6ed..0f3e73f7b1b03 100644 --- a/pandas/tseries/frequencies.py +++ b/pandas/tseries/frequencies.py @@ -27,7 +27,7 @@ from pandas._libs.tslibs.offsets import ( DateOffset, Day, - to_offset, + to_offset as _to_offset, ) from pandas._libs.tslibs.parsing import get_rule_month from pandas.util._decorators import cache_readonly @@ -53,6 +53,12 @@ TimedeltaIndex, ) from pandas.core.arrays.datetimelike import DatetimeLikeArrayMixin + +_DEPRECATED_FREQ_ALIASES = { + "H": "h", + "T": "min", + "S": "s", +} # -------------------------------------------------------------------- # Offset related functions @@ -600,6 +606,20 @@ def _is_weekly(rule: str) -> bool: return rule == "W" or rule.startswith("W-") +def to_offset(freq): + try: + return _to_offset(freq) + except Exception as err: + if isinstance(freq, str) and freq in _DEPRECATED_FREQ_ALIASES: + suggestion = _DEPRECATED_FREQ_ALIASES[freq] + raise ValueError( + f"Invalid frequency '{freq}'. Did you mean '{suggestion}'?" + ) from None + raise ValueError( + f"Invalid frequency: {freq}, failed to parse with error message: {err}" + ) from None + + __all__ = [ "Day", "get_period_alias",