Skip to content

Commit 97ad707

Browse files
committed
Merge pull request #7195 from sinhrks/easter
BUG: Easter works incorrectly in negative offsets
2 parents 1754bb5 + 50902a2 commit 97ad707

File tree

3 files changed

+24
-5
lines changed

3 files changed

+24
-5
lines changed

doc/source/v0.14.1.txt

+1
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,4 @@ Bug Fixes
8686
wouldn't test ``True`` when it encountered an ``inf``/``-inf``
8787
(:issue:`7315`).
8888
- Bug in inferred_freq results in None for eastern hemisphere timezones (:issue:`7310`)
89+
- Bug in ``Easter`` returns incorrect date when offset is negative (:issue:`7195`)

pandas/tseries/offsets.py

+9-5
Original file line numberDiff line numberDiff line change
@@ -1846,12 +1846,16 @@ def apply(self, other):
18461846
currentEaster = datetime(currentEaster.year, currentEaster.month, currentEaster.day)
18471847

18481848
# NOTE: easter returns a datetime.date so we have to convert to type of other
1849-
if other >= currentEaster:
1850-
new = easter(other.year + self.n)
1851-
elif other < currentEaster:
1852-
new = easter(other.year + self.n - 1)
1849+
if self.n >= 0:
1850+
if other >= currentEaster:
1851+
new = easter(other.year + self.n)
1852+
else:
1853+
new = easter(other.year + self.n - 1)
18531854
else:
1854-
new = other
1855+
if other > currentEaster:
1856+
new = easter(other.year + self.n + 1)
1857+
else:
1858+
new = easter(other.year + self.n)
18551859

18561860
# FIXME: There has to be a better way to do this, but I don't know what it is
18571861
if isinstance(other, Timestamp):

pandas/tseries/tests/test_offsets.py

+14
Original file line numberDiff line numberDiff line change
@@ -2483,16 +2483,30 @@ def test_onOffset(self):
24832483
def assertEq(offset, base, expected):
24842484
actual = offset + base
24852485
actual_swapped = base + offset
2486+
actual_apply = offset.apply(base)
24862487
try:
24872488
assert actual == expected
24882489
assert actual_swapped == expected
2490+
assert actual_apply == expected
24892491
except AssertionError:
24902492
raise AssertionError("\nExpected: %s\nActual: %s\nFor Offset: %s)"
24912493
"\nAt Date: %s" %
24922494
(expected, actual, offset, base))
24932495

24942496
def test_Easter():
24952497
assertEq(Easter(), datetime(2010, 1, 1), datetime(2010, 4, 4))
2498+
assertEq(Easter(), datetime(2010, 4, 5), datetime(2011, 4, 24))
2499+
assertEq(Easter(2), datetime(2010, 1, 1), datetime(2011, 4, 24))
2500+
2501+
assertEq(Easter(), datetime(2010, 4, 4), datetime(2011, 4, 24))
2502+
assertEq(Easter(2), datetime(2010, 4, 4), datetime(2012, 4, 8))
2503+
2504+
assertEq(-Easter(), datetime(2011, 1, 1), datetime(2010, 4, 4))
2505+
assertEq(-Easter(), datetime(2010, 4, 5), datetime(2010, 4, 4))
2506+
assertEq(-Easter(2), datetime(2011, 1, 1), datetime(2009, 4, 12))
2507+
2508+
assertEq(-Easter(), datetime(2010, 4, 4), datetime(2009, 4, 12))
2509+
assertEq(-Easter(2), datetime(2010, 4, 4), datetime(2008, 3, 23))
24962510

24972511
def test_Hour():
24982512
assertEq(Hour(), datetime(2010, 1, 1), datetime(2010, 1, 1, 1))

0 commit comments

Comments
 (0)