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: diff --git a/pandas/tests/resample/test_datetime_index.py b/pandas/tests/resample/test_datetime_index.py index dc2ddcc70828f..328c946d2eed3 100644 --- a/pandas/tests/resample/test_datetime_index.py +++ b/pandas/tests/resample/test_datetime_index.py @@ -2020,6 +2020,29 @@ 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) + + 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}"