Skip to content

Updating and re-opening PR #48275 #50542

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 8 commits into from
1 change: 1 addition & 0 deletions doc/source/whatsnew/v2.0.0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -819,6 +819,7 @@ Datetimelike
- Bug in :func:`to_datetime` was throwing ``ValueError`` when parsing dates with ISO8601 format where some values were not zero-padded (:issue:`21422`)
- Bug in :func:`to_datetime` was giving incorrect results when using ``format='%Y%m%d'`` and ``errors='ignore'`` (:issue:`26493`)
- Bug in :func:`to_datetime` was failing to parse date strings ``'today'`` and ``'now'`` if ``format`` was not ISO8601 (:issue:`50359`)
- Bug in :class:`RelativeDeltaOffset` which caused inconsistent behavior upon multiplying a :class:`DateOffset` (:issue:`47953`)
-

Timedelta
Expand Down
7 changes: 1 addition & 6 deletions pandas/_libs/tslibs/offsets.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -1229,12 +1229,7 @@ cdef class RelativeDeltaOffset(BaseOffset):
else:
td_nano = Timedelta(0)

if self.n > 0:
for i in range(self.n):
other = other + self._offset + td_nano
else:
for i in range(-self.n):
other = other - self._offset - td_nano
other = other + ((self._offset + td_nano) * self.n)

if tzinfo is not None and self._use_relativedelta:
# bring tz back from UTC calculation
Expand Down
33 changes: 33 additions & 0 deletions pandas/tests/tseries/offsets/test_offsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
from pandas.errors import PerformanceWarning

from pandas import (
DataFrame,
DatetimeIndex,
Series,
date_range,
Expand Down Expand Up @@ -1061,6 +1062,38 @@ def test_construct_int_arg_no_kwargs_assumed_days(n):
assert result == expected


def test_offset_multiplication():
# GH#47953
mo1 = DateOffset(months=1)
mo2 = DateOffset(months=2)

startscalar = Timestamp("2020-01-30")
startarray = Series([Timestamp("2020-01-30")])
Comment on lines +1070 to +1071
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could these be parametrised over?


resultscalar1 = startscalar + (mo1 * 2)
resultscalar2 = startscalar + mo2
resultarray1 = startarray + (mo1 * 2)
resultarray2 = startarray + mo2

expectedscalar = Timestamp("2020-03-30")
expectedarray = Series([Timestamp("2020-03-30")])
assert resultscalar1 == expectedscalar
assert resultscalar2 == expectedscalar
tm.assert_series_equal(resultarray1, expectedarray)
tm.assert_series_equal(resultarray2, expectedarray)

df = DataFrame({"T": [Timestamp("2019-04-30")], "D": [DateOffset(months=1)]})
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be a separate test.

frameresult1 = df["T"] + 26 * df["D"]
df2 = DataFrame(
{
"T": [Timestamp("2019-04-30"), Timestamp("2019-04-30")],
"D": [DateOffset(months=1), DateOffset(months=1)],
}
)
frameresult2 = df2["T"] + 26 * df2["D"]
assert frameresult1[0] == frameresult2[0]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

any chance they could both be checked against some expected output? otherwise perhaps in the future they could both change and become wrong?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, I can do that. I haven't had much time to work on this recently, but I'll try to handle all these comments when I find some time to deal with them.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sure, no hurry, thanks!



@pytest.mark.parametrize(
"offset, expected",
[
Expand Down