Skip to content

Commit 9385b62

Browse files
committed
ENH: more legacy time rule support, close #1041
1 parent ad9cffd commit 9385b62

File tree

3 files changed

+37
-17
lines changed

3 files changed

+37
-17
lines changed

pandas/core/datetools.py

+22-7
Original file line numberDiff line numberDiff line change
@@ -726,7 +726,7 @@ def _interval_group(freqstr):
726726

727727
def _get_freq_code(freqstr):
728728
if isinstance(freqstr, DateOffset):
729-
freqstr = (getOffsetName(freqstr), freqstr.n)
729+
freqstr = (get_offset_name(freqstr), freqstr.n)
730730

731731
if isinstance(freqstr, tuple):
732732
if (isinstance(freqstr[0], (int, long)) and
@@ -1943,10 +1943,11 @@ def rule_code(self):
19431943
'BAS-NOV' : BYearBegin(month=11),
19441944
'BAS-DEC' : BYearBegin(month=12),
19451945
# Quarterly - Calendar
1946+
# 'Q' : QuarterEnd(startingMonth=3),
1947+
19461948
'Q-JAN' : QuarterEnd(startingMonth=1),
19471949
'Q-FEB' : QuarterEnd(startingMonth=2),
19481950
'Q-MAR' : QuarterEnd(startingMonth=3),
1949-
'Q' : QuarterEnd(startingMonth=3),
19501951
'Q-APR' : QuarterEnd(startingMonth=4),
19511952
'Q-MAY' : QuarterEnd(startingMonth=5),
19521953
'Q-JUN' : QuarterEnd(startingMonth=6),
@@ -1957,8 +1958,9 @@ def rule_code(self):
19571958
'Q-NOV' : QuarterEnd(startingMonth=11),
19581959
'Q-DEC' : QuarterEnd(startingMonth=12),
19591960
# Quarterly - Calendar (Start)
1961+
# 'QS' : QuarterBegin(startingMonth=1),
1962+
19601963
'QS-JAN' : QuarterBegin(startingMonth=1),
1961-
'QS' : QuarterBegin(startingMonth=1),
19621964
'QS-FEB' : QuarterBegin(startingMonth=2),
19631965
'QS-MAR' : QuarterBegin(startingMonth=3),
19641966
'QS-APR' : QuarterBegin(startingMonth=4),
@@ -1974,7 +1976,9 @@ def rule_code(self):
19741976
'BQ-JAN' : BQuarterEnd(startingMonth=1),
19751977
'BQ-FEB' : BQuarterEnd(startingMonth=2),
19761978
'BQ-MAR' : BQuarterEnd(startingMonth=3),
1977-
'BQ' : BQuarterEnd(startingMonth=3),
1979+
1980+
# 'BQ' : BQuarterEnd(startingMonth=3),
1981+
19781982
'BQ-APR' : BQuarterEnd(startingMonth=4),
19791983
'BQ-MAY' : BQuarterEnd(startingMonth=5),
19801984
'BQ-JUN' : BQuarterEnd(startingMonth=6),
@@ -2056,6 +2060,8 @@ def rule_code(self):
20562060
}
20572061

20582062

2063+
_legacy_reverse_map = dict((v, k) for k, v in _rule_aliases.iteritems())
2064+
20592065
for i, weekday in enumerate(['MON', 'TUE', 'WED', 'THU', 'FRI']):
20602066
for iweek in xrange(4):
20612067
_offset_map['WOM@%d%s' % (iweek + 1, weekday)] = \
@@ -2174,13 +2180,13 @@ def get_offset(name):
21742180
def hasOffsetName(offset):
21752181
return offset in _offset_names
21762182

2177-
def getOffsetName(offset):
2183+
def get_offset_name(offset):
21782184
"""
21792185
Return rule name associated with a DateOffset object
21802186
21812187
Example
21822188
-------
2183-
getOffsetName(BMonthEnd(1)) --> 'EOM'
2189+
get_offset_name(BMonthEnd(1)) --> 'EOM'
21842190
"""
21852191
name = _offset_names.get(offset)
21862192

@@ -2189,6 +2195,15 @@ def getOffsetName(offset):
21892195
else:
21902196
raise Exception('Bad rule given: %s!' % offset)
21912197

2198+
def get_legacy_offset_name(offset):
2199+
"""
2200+
Return the pre pandas 0.8.0 name for the date offset
2201+
"""
2202+
name = _offset_names.get(offset)
2203+
return _legacy_reverse_map.get(name, name)
2204+
2205+
get_offset_name = get_offset_name
2206+
21922207
def get_standard_freq(freq):
21932208
"""
21942209
Return the standardized frequency string
@@ -2197,7 +2212,7 @@ def get_standard_freq(freq):
21972212
return None
21982213

21992214
if isinstance(freq, DateOffset):
2200-
return getOffsetName(freq)
2215+
return get_offset_name(freq)
22012216

22022217
code, stride = _get_freq_code(freq)
22032218
return _get_freq_str(code, stride)

pandas/tests/test_datetools.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
BYearBegin, QuarterBegin, BQuarterBegin, BMonthBegin,
88
DateOffset, Week, YearBegin, YearEnd, Hour, Minute, Second,
99
WeekOfMonth, format, ole2datetime, QuarterEnd, to_datetime, normalize_date,
10-
get_offset, getOffsetName, inferTimeRule, hasOffsetName,
10+
get_offset, get_offset_name, inferTimeRule, hasOffsetName,
1111
_dt_box, _dt_unbox, parse_time_string, get_standard_freq,
1212
_offset_map)
1313

@@ -1266,16 +1266,16 @@ def test_hasOffsetName():
12661266
assert hasOffsetName(BDay())
12671267
assert not hasOffsetName(BDay(2))
12681268

1269-
def test_getOffsetName():
1270-
assert_raises(Exception, getOffsetName, BDay(2))
1269+
def test_get_offset_name():
1270+
assert_raises(Exception, get_offset_name, BDay(2))
12711271

1272-
assert getOffsetName(BDay()) == 'B'
1273-
assert getOffsetName(BMonthEnd()) == 'BM'
1274-
assert getOffsetName(Week(weekday=0)) == 'W-MON'
1275-
assert getOffsetName(Week(weekday=1)) =='W-TUE'
1276-
assert getOffsetName(Week(weekday=2)) == 'W-WED'
1277-
assert getOffsetName(Week(weekday=3)) == 'W-THU'
1278-
assert getOffsetName(Week(weekday=4)) == 'W-FRI'
1272+
assert get_offset_name(BDay()) == 'B'
1273+
assert get_offset_name(BMonthEnd()) == 'BM'
1274+
assert get_offset_name(Week(weekday=0)) == 'W-MON'
1275+
assert get_offset_name(Week(weekday=1)) =='W-TUE'
1276+
assert get_offset_name(Week(weekday=2)) == 'W-WED'
1277+
assert get_offset_name(Week(weekday=3)) == 'W-THU'
1278+
assert get_offset_name(Week(weekday=4)) == 'W-FRI'
12791279

12801280

12811281
def test_get_offset():

pandas/tests/test_timeseries.py

+5
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,11 @@ def test_legacy_time_rules(self):
529529
new_rng = date_range(start, end, freq=new_freq)
530530
self.assert_(old_rng.equals(new_rng))
531531

532+
# test get_legacy_offset_name
533+
offset = datetools.get_offset(new_freq)
534+
old_name = datetools.get_legacy_offset_name(offset)
535+
self.assertEquals(old_name, old_freq)
536+
532537
def test_ms_vs_MS(self):
533538
left = datetools.get_offset('ms')
534539
right = datetools.get_offset('MS')

0 commit comments

Comments
 (0)