Skip to content

Commit cfa70db

Browse files
committed
BUG: handling datetime.date in more places in DateOffset classes close #1395
1 parent 36f24af commit cfa70db

File tree

3 files changed

+28
-20
lines changed

3 files changed

+28
-20
lines changed

RELEASE.rst

+2-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ pandas 0.9.0
3535
- Add Options class to pandas.io.data for fetching options data from Yahoo!
3636
Finance (#1748, #1739)
3737
- Recognize and convert more boolean values in file parsing (Yes, No, TRUE,
38-
FALSE, variants thereof) (#1691)
38+
FALSE, variants thereof) (#1691, #1295)
3939

4040
**Improvements to existing features**
4141

@@ -179,6 +179,7 @@ pandas 0.9.0
179179
- Fix error while retrieving timezone and utc offset from subclasses of
180180
datetime.tzinfo without .zone and ._utcoffset attributes (#1922)
181181
- Fix DataFrame formatting of small, non-zero FP numbers (#1911)
182+
- Various fixes by upcasting of date -> datetime (#1395)
182183

183184
pandas 0.8.1
184185
============

pandas/tseries/offsets.py

+19-19
Original file line numberDiff line numberDiff line change
@@ -182,30 +182,25 @@ def __neg__(self):
182182

183183
def rollback(self, dt):
184184
"""Roll provided date backward to next offset only if not on offset"""
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
185+
if type(dt) == date:
186+
dt = datetime(dt.year, dt.month, dt.day)
187+
188+
if not self.onOffset(dt):
189+
dt = dt - self.__class__(1, **self.kwds)
190+
return dt
194191

195192
def rollforward(self, dt):
196193
"""Roll provided date forward to next offset only if not on offset"""
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
194+
if type(dt) == date:
195+
dt = datetime(dt.year, dt.month, dt.day)
196+
197+
if not self.onOffset(dt):
198+
dt = dt + self.__class__(1, **self.kwds)
199+
return dt
206200

207201
def onOffset(self, dt):
208-
if type(self) == DateOffset:
202+
# XXX, see #1395
203+
if type(self) == DateOffset or isinstance(self, Tick):
209204
return True
210205

211206
# Default (slow) method for determining if some date is a member of the
@@ -1033,10 +1028,15 @@ def nanos(self):
10331028
return _delta_to_nanoseconds(self.delta)
10341029

10351030
def apply(self, other):
1031+
if type(other) == date:
1032+
other = datetime(other.year, other.month, other.day)
1033+
10361034
if isinstance(other, (datetime, timedelta)):
10371035
return other + self.delta
10381036
elif isinstance(other, type(self)):
10391037
return type(self)(self.n + other.n)
1038+
else: # pragma: no cover
1039+
raise TypeError('Unhandled type: %s' % type(other))
10401040

10411041
_rule_base = 'undefined'
10421042
@property

pandas/tseries/tests/test_offsets.py

+7
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,13 @@ def test_roll_date_object(self):
184184
result = offset.rollforward(dt)
185185
self.assertEqual(result, datetime(2012, 9, 17))
186186

187+
offset = offsets.Day()
188+
result = offset.rollback(dt)
189+
self.assertEqual(result, datetime(2012, 9, 15))
190+
191+
result = offset.rollforward(dt)
192+
self.assertEqual(result, datetime(2012, 9, 15))
193+
187194
def test_onOffset(self):
188195
tests = [(BDay(), datetime(2008, 1, 1), True),
189196
(BDay(), datetime(2008, 1, 5), False)]

0 commit comments

Comments
 (0)