Skip to content

Commit 0c0231f

Browse files
committed
Merge remote-tracking branch 'jseabold/fix-2844'
* jseabold/fix-2844: TST: Use correct expectations for AS in tests STY: Remove unnecessary old code. BUG: Fix corner case in YearBegin BUG: Fix broken YearBegin offset. Closes #2844.
2 parents 600047e + f9e533a commit 0c0231f

File tree

3 files changed

+61
-15
lines changed

3 files changed

+61
-15
lines changed

pandas/tseries/offsets.py

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -966,27 +966,52 @@ class YearBegin(DateOffset, CacheableOffset):
966966
"""DateOffset increments between calendar year begin dates"""
967967

968968
def __init__(self, n=1, **kwds):
969-
self.month = kwds.get('month', 12)
969+
self.month = kwds.get('month', 1)
970970

971971
if self.month < 1 or self.month > 12:
972972
raise ValueError('Month must go from 1 to 12')
973973

974974
DateOffset.__init__(self, n=n, **kwds)
975975

976976
def apply(self, other):
977+
def _increment(date):
978+
year = date.year
979+
if date.month >= self.month:
980+
year += 1
981+
return datetime(year, self.month, 1, date.hour, date.minute,
982+
date.second, date.microsecond)
983+
984+
def _decrement(date):
985+
year = date.year
986+
if date.month < self.month or (date.month == self.month and
987+
date.day == 1):
988+
year -= 1
989+
return datetime(year, self.month, 1, date.hour, date.minute,
990+
date.second, date.microsecond)
991+
992+
def _rollf(date):
993+
if (date.month != self.month) or date.day > 1:
994+
date = _increment(date)
995+
return date
996+
977997
n = self.n
978-
if other.month != 1 or other.day != 1:
979-
other = datetime(other.year, 1, 1,
980-
other.hour, other.minute, other.second,
981-
other.microsecond)
982-
if n <= 0:
983-
n = n + 1
984-
other = other + relativedelta(years=n, day=1)
985-
return other
998+
result = other
999+
if n > 0:
1000+
while n > 0:
1001+
result = _increment(result)
1002+
n -= 1
1003+
elif n < 0:
1004+
while n < 0:
1005+
result = _decrement(result)
1006+
n += 1
1007+
else:
1008+
# n == 0, roll forward
1009+
result = _rollf(result)
9861010

987-
@classmethod
988-
def onOffset(cls, dt):
989-
return dt.month == 1 and dt.day == 1
1011+
return result
1012+
1013+
def onOffset(self, dt):
1014+
return dt.month == self.month and dt.day == 1
9901015

9911016
@property
9921017
def rule_code(self):

pandas/tseries/tests/test_offsets.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,6 +1128,7 @@ def test_offset(self):
11281128

11291129
tests.append((YearBegin(-1),
11301130
{datetime(2007, 1, 1): datetime(2006, 1, 1),
1131+
datetime(2007, 1, 15): datetime(2007, 1, 1),
11311132
datetime(2008, 6, 30): datetime(2008, 1, 1),
11321133
datetime(2008, 12, 31): datetime(2008, 1, 1),
11331134
datetime(2006, 12, 29): datetime(2006, 1, 1),
@@ -1139,6 +1140,26 @@ def test_offset(self):
11391140
datetime(2008, 6, 30): datetime(2007, 1, 1),
11401141
datetime(2008, 12, 31): datetime(2007, 1, 1), }))
11411142

1143+
tests.append((YearBegin(month=4),
1144+
{datetime(2007, 4, 1): datetime(2008, 4, 1),
1145+
datetime(2007, 4, 15): datetime(2008, 4, 1),
1146+
datetime(2007, 3, 1): datetime(2007, 4, 1),
1147+
datetime(2007, 12, 15): datetime(2008, 4, 1),
1148+
datetime(2012, 1, 31): datetime(2012, 4, 1), }))
1149+
1150+
tests.append((YearBegin(0, month=4),
1151+
{datetime(2007, 4, 1): datetime(2007, 4, 1),
1152+
datetime(2007, 3, 1): datetime(2007, 4, 1),
1153+
datetime(2007, 12, 15): datetime(2008, 4, 1),
1154+
datetime(2012, 1, 31): datetime(2012, 4, 1), }))
1155+
1156+
tests.append((YearBegin(-1, month=4),
1157+
{datetime(2007, 4, 1): datetime(2006, 4, 1),
1158+
datetime(2007, 3, 1): datetime(2006, 4, 1),
1159+
datetime(2007, 12, 15): datetime(2007, 4, 1),
1160+
datetime(2012, 1, 31): datetime(2011, 4, 1), }))
1161+
1162+
11421163
for offset, cases in tests:
11431164
for base, expected in cases.iteritems():
11441165
assertEq(offset, base, expected)

pandas/tseries/tests/test_period.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,7 +1245,7 @@ def test_to_timestamp(self):
12451245
self.assert_(result.index.equals(exp_index))
12461246
self.assertEquals(result.name, 'foo')
12471247

1248-
exp_index = date_range('1/1/2001', end='1/1/2009', freq='AS-DEC')
1248+
exp_index = date_range('1/1/2001', end='1/1/2009', freq='AS-JAN')
12491249
result = series.to_timestamp(how='start')
12501250
self.assert_(result.index.equals(exp_index))
12511251

@@ -1354,7 +1354,7 @@ def test_frame_to_time_stamp(self):
13541354
self.assert_(result.index.equals(exp_index))
13551355
assert_almost_equal(result.values, df.values)
13561356

1357-
exp_index = date_range('1/1/2001', end='1/1/2009', freq='AS-DEC')
1357+
exp_index = date_range('1/1/2001', end='1/1/2009', freq='AS-JAN')
13581358
result = df.to_timestamp('D', 'start')
13591359
self.assert_(result.index.equals(exp_index))
13601360

@@ -1385,7 +1385,7 @@ def _get_with_delta(delta, freq='A-DEC'):
13851385
self.assert_(result.columns.equals(exp_index))
13861386
assert_almost_equal(result.values, df.values)
13871387

1388-
exp_index = date_range('1/1/2001', end='1/1/2009', freq='AS-DEC')
1388+
exp_index = date_range('1/1/2001', end='1/1/2009', freq='AS-JAN')
13891389
result = df.to_timestamp('D', 'start', axis=1)
13901390
self.assert_(result.columns.equals(exp_index))
13911391

0 commit comments

Comments
 (0)