From 09a4702f916365f50a9f3c305e58c87f30d6a475 Mon Sep 17 00:00:00 2001 From: chx <2589027571@qq.com> Date: Fri, 29 Aug 2025 15:40:19 +0800 Subject: [PATCH] Preserve freq in TimedeltaIndex subtraction --- pandas/core/arrays/datetimelike.py | 6 ++++++ pandas/tests/indexes/datetimes/test_arithmetic.py | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index 7e57b40e42430..d27961ae704bd 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -1089,6 +1089,12 @@ def _get_arithmetic_result_freq(self, other) -> BaseOffset | None: # e.g. TestTimedelta64ArithmeticUnsorted::test_timedelta # Day is unambiguously 24h return self.freq + elif ( + lib.is_np_dtype(self.dtype, "M") + and isinstance(other, Timestamp) + and isinstance(self.freq, Day) + ): + return self.freq return None diff --git a/pandas/tests/indexes/datetimes/test_arithmetic.py b/pandas/tests/indexes/datetimes/test_arithmetic.py index ba9f82f1064ca..1c19133fff483 100644 --- a/pandas/tests/indexes/datetimes/test_arithmetic.py +++ b/pandas/tests/indexes/datetimes/test_arithmetic.py @@ -63,3 +63,14 @@ def test_add_dti_day(self): result = (dti + dti.freq)[:-1] expected = dti[1:] tm.assert_index_equal(result, expected) + + def test_sub_timestamp_preserves_day_freq(self): + # GH#62094 + dti = date_range("2021-01-01", periods=5, freq="D") + ts = Timestamp("2020-01-01") + + result = dti - ts + + # The one crucial assertion: + assert isinstance(result, TimedeltaIndex) + assert result.freq == dti.freq