From ff237d14c47de2f509834cbfe4724bb091d48c6c Mon Sep 17 00:00:00 2001 From: Katsiaryna Date: Mon, 19 Aug 2024 15:45:29 +0100 Subject: [PATCH 1/3] Add failing test --- pandas/tests/resample/test_datetime_index.py | 27 ++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/pandas/tests/resample/test_datetime_index.py b/pandas/tests/resample/test_datetime_index.py index dc2ddcc70828f..a3e5df8118f4b 100644 --- a/pandas/tests/resample/test_datetime_index.py +++ b/pandas/tests/resample/test_datetime_index.py @@ -2020,6 +2020,33 @@ def test_resample_empty_series_with_tz(): tm.assert_series_equal(result, expected) +def test_resample_quarters_non_unitary(): + # https://github.com/pandas-dev/pandas/issues/29576 + + d = Series( + data=np.zeros(365), index=date_range("1950-01-01", "1950-12-31", freq="D") + ) + + actual = d.resample("2QS-MAR").mean() + expected_idx = DatetimeIndex( + np.array( + [ + "1949-09-01", + "1950-03-01", + "1950-09-01", + ] + ).astype("datetime64[ns]"), + freq="2QS-MAR", + ) + expected = Series(0.0, index=expected_idx) + print("actual") + print(actual) + print("expected") + print(expected) + + tm.assert_series_equal(expected, actual) + + @pytest.mark.parametrize("freq", ["2M", "2m", "2Q", "2Q-SEP", "2q-sep", "1Y", "2Y-MAR"]) def test_resample_M_Q_Y_raises(freq): msg = f"Invalid frequency: {freq}" From faf86f14815575778b3399063eb179d64e8026b0 Mon Sep 17 00:00:00 2001 From: Katsiaryna Date: Mon, 19 Aug 2024 15:46:05 +0100 Subject: [PATCH 2/3] Respect n in rollback, rollforward --- pandas/_libs/tslibs/offsets.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/_libs/tslibs/offsets.pyx b/pandas/_libs/tslibs/offsets.pyx index fd1bb3fe3e173..ba79fa9fe5120 100644 --- a/pandas/_libs/tslibs/offsets.pyx +++ b/pandas/_libs/tslibs/offsets.pyx @@ -656,7 +656,7 @@ cdef class BaseOffset: """ dt = Timestamp(dt) if not self.is_on_offset(dt): - dt = dt - type(self)(1, normalize=self.normalize, **self.kwds) + dt = dt - type(self)(self.n, normalize=self.normalize, **self.kwds) return dt def rollforward(self, dt) -> datetime: @@ -670,7 +670,7 @@ cdef class BaseOffset: """ dt = Timestamp(dt) if not self.is_on_offset(dt): - dt = dt + type(self)(1, normalize=self.normalize, **self.kwds) + dt = dt + type(self)(self.n, normalize=self.normalize, **self.kwds) return dt def _get_offset_day(self, other: datetime) -> int: From 88cbf98ea63f0efe749b04d9bcc98c8db9b622ff Mon Sep 17 00:00:00 2001 From: Katsiaryna Date: Mon, 19 Aug 2024 15:48:18 +0100 Subject: [PATCH 3/3] remove prints --- pandas/tests/resample/test_datetime_index.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pandas/tests/resample/test_datetime_index.py b/pandas/tests/resample/test_datetime_index.py index a3e5df8118f4b..328c946d2eed3 100644 --- a/pandas/tests/resample/test_datetime_index.py +++ b/pandas/tests/resample/test_datetime_index.py @@ -2039,10 +2039,6 @@ def test_resample_quarters_non_unitary(): freq="2QS-MAR", ) expected = Series(0.0, index=expected_idx) - print("actual") - print(actual) - print("expected") - print(expected) tm.assert_series_equal(expected, actual)