Skip to content

Commit e98a568

Browse files
committed
BUG: support datetime.date in rollback/rollforward
1 parent bd60865 commit e98a568

File tree

3 files changed

+33
-9
lines changed

3 files changed

+33
-9
lines changed

RELEASE.rst

+1
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ pandas 0.9.0
164164
- Fix column name formatting issue in length-truncated column (#1906)
165165
- Fix broken handling of copying Index metadata to new instances created by
166166
view(...) calls inside the NumPy infrastructure
167+
- Support datetime.date again in DateOffset.rollback/rollforward
167168

168169
pandas 0.8.1
169170
============

pandas/tseries/offsets.py

+20-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from datetime import datetime, timedelta
1+
from datetime import date, datetime, timedelta
22

33
from pandas.tseries.tools import to_datetime
44

@@ -180,17 +180,29 @@ def __rmul__(self, someInt):
180180
def __neg__(self):
181181
return self.__class__(-self.n, **self.kwds)
182182

183-
def rollback(self, someDate):
183+
def rollback(self, dt):
184184
"""Roll provided date backward to next offset only if not on offset"""
185-
if not self.onOffset(someDate):
186-
someDate = someDate - self.__class__(1, **self.kwds)
187-
return someDate
185+
try:
186+
if not self.onOffset(dt):
187+
dt = dt - self.__class__(1, **self.kwds)
188+
return dt
189+
except Exception:
190+
if isinstance(dt, date):
191+
return self.rollback(datetime(dt.year, dt.month, dt.day))
192+
else:
193+
raise
188194

189195
def rollforward(self, dt):
190196
"""Roll provided date forward to next offset only if not on offset"""
191-
if not self.onOffset(dt):
192-
dt = dt + self.__class__(1, **self.kwds)
193-
return dt
197+
try:
198+
if not self.onOffset(dt):
199+
dt = dt + self.__class__(1, **self.kwds)
200+
return dt
201+
except Exception:
202+
if isinstance(dt, date):
203+
return self.rollforward(datetime(dt.year, dt.month, dt.day))
204+
else:
205+
raise
194206

195207
def onOffset(self, dt):
196208
if type(self) == DateOffset:

pandas/tseries/tests/test_offsets.py

+12-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from datetime import datetime, timedelta
1+
from datetime import date, datetime, timedelta
22
import unittest
33
import numpy as np
44

@@ -173,6 +173,17 @@ def testRollforward1(self):
173173
def testRollforward2(self):
174174
self.assertEqual(BDay(10).rollforward(datetime(2008, 1, 5)), datetime(2008, 1, 7))
175175

176+
def test_roll_date_object(self):
177+
offset = BDay()
178+
179+
dt = date(2012, 9, 15)
180+
181+
result = offset.rollback(dt)
182+
self.assertEqual(result, datetime(2012, 9, 14))
183+
184+
result = offset.rollforward(dt)
185+
self.assertEqual(result, datetime(2012, 9, 17))
186+
176187
def test_onOffset(self):
177188
tests = [(BDay(), datetime(2008, 1, 1), True),
178189
(BDay(), datetime(2008, 1, 5), False)]

0 commit comments

Comments
 (0)