Skip to content

Commit 1d3ed84

Browse files
committed
ENH: frequency inference and tests, close #391
1 parent da2b7ad commit 1d3ed84

File tree

8 files changed

+329
-177
lines changed

8 files changed

+329
-177
lines changed

RELEASE.rst

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ pandas 0.8.0
2929

3030
- Add GroupBy.prod optimized aggregation function and 'prod' fast time series
3131
conversion method (#1018)
32+
- Implement robust frequency inference function and `inferred_freq` attribute
33+
on DatetimeIndex (#391)
3234

3335
**Improvements to existing features**
3436

pandas/core/algorithms.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
import numpy as np
77

8-
from pandas.core.series import Series
98
import pandas.core.common as com
109
import pandas._tseries as lib
1110

@@ -26,6 +25,12 @@ def match(values, index):
2625
def unique(values):
2726
"""
2827
28+
Parameters
29+
----------
30+
31+
Returns
32+
-------
33+
2934
"""
3035
f = lambda htype, caster: _unique_generic(values, htype, caster)
3136
return _hashtable_algo(f, values.dtype)
@@ -52,6 +57,8 @@ def _hashtable_algo(f, dtype):
5257

5358

5459
def _count_generic(values, table_type, type_caster):
60+
from pandas.core.series import Series
61+
5562
values = type_caster(values)
5663
table = table_type(len(values))
5764
uniques, labels, counts = table.factorize(values)
@@ -113,6 +120,7 @@ def value_counts(values, sort=True, ascending=False):
113120
-------
114121
value_counts : Series
115122
"""
123+
from pandas.core.series import Series
116124
from collections import defaultdict
117125
if com.is_integer_dtype(values.dtype):
118126
values = com._ensure_int64(values)

pandas/tests/test_datetools.py

+52-71
Original file line numberDiff line numberDiff line change
@@ -220,9 +220,9 @@ def test_apply(self):
220220
datetime(2008, 1, 6): datetime(2008, 1, 7),
221221
datetime(2008, 1, 7): datetime(2008, 1, 7)}))
222222

223-
for dateOffset, cases in tests:
224-
for baseDate, expected in cases.iteritems():
225-
assertEq(dateOffset, baseDate, expected)
223+
for offset, cases in tests:
224+
for base, expected in cases.iteritems():
225+
assertEq(offset, base, expected)
226226

227227
def test_apply_corner(self):
228228
self.assertRaises(Exception, BDay().apply, BMonthEnd())
@@ -277,9 +277,9 @@ def test_offset(self):
277277
datetime(2010, 4, 8): datetime(2010, 3, 30),
278278
datetime(2010, 4, 5): datetime(2010, 3, 23)}))
279279

280-
for dateOffset, cases in tests:
281-
for baseDate, expected in cases.iteritems():
282-
assertEq(dateOffset, baseDate, expected)
280+
for offset, cases in tests:
281+
for base, expected in cases.iteritems():
282+
assertEq(offset, base, expected)
283283

284284
def test_onOffset(self):
285285
for weekday in range(7):
@@ -414,9 +414,9 @@ def test_offset(self):
414414
datetime(2006, 12, 30): datetime(2006, 12, 1),
415415
datetime(2007, 1, 1): datetime(2006, 12, 1)}))
416416

417-
for dateOffset, cases in tests:
418-
for baseDate, expected in cases.iteritems():
419-
assertEq(dateOffset, baseDate, expected)
417+
for offset, cases in tests:
418+
for base, expected in cases.iteritems():
419+
assertEq(offset, base, expected)
420420

421421
def test_onOffset(self):
422422

@@ -470,9 +470,9 @@ def test_offset(self):
470470
datetime(2006, 12, 30): datetime(2006, 12, 29),
471471
datetime(2007, 1, 1): datetime(2006, 12, 29)}))
472472

473-
for dateOffset, cases in tests:
474-
for baseDate, expected in cases.iteritems():
475-
assertEq(dateOffset, baseDate, expected)
473+
for offset, cases in tests:
474+
for base, expected in cases.iteritems():
475+
assertEq(offset, base, expected)
476476

477477
def test_onOffset(self):
478478

@@ -523,9 +523,9 @@ def test_offset(self):
523523
datetime(2006, 12, 29): datetime(2006, 12, 1),
524524
datetime(2006, 1, 2): datetime(2006, 1, 1)}))
525525

526-
for dateOffset, cases in tests:
527-
for baseDate, expected in cases.iteritems():
528-
assertEq(dateOffset, baseDate, expected)
526+
for offset, cases in tests:
527+
for base, expected in cases.iteritems():
528+
assertEq(offset, base, expected)
529529

530530
class TestMonthEnd(unittest.TestCase):
531531

@@ -563,9 +563,9 @@ def test_offset(self):
563563
datetime(2006, 12, 30): datetime(2006, 11, 30),
564564
datetime(2007, 1, 1): datetime(2006, 12, 31)}))
565565

566-
for dateOffset, cases in tests:
567-
for baseDate, expected in cases.iteritems():
568-
assertEq(dateOffset, baseDate, expected)
566+
for offset, cases in tests:
567+
for base, expected in cases.iteritems():
568+
assertEq(offset, base, expected)
569569

570570
def test_onOffset(self):
571571

@@ -651,9 +651,9 @@ def test_offset(self):
651651
datetime(2007, 4, 15): datetime(2007, 10, 1),
652652
datetime(2008, 4, 30): datetime(2008, 10, 1),}))
653653

654-
for dateOffset, cases in tests:
655-
for baseDate, expected in cases.iteritems():
656-
assertEq(dateOffset, baseDate, expected)
654+
for offset, cases in tests:
655+
for base, expected in cases.iteritems():
656+
assertEq(offset, base, expected)
657657

658658
# corner
659659
offset = BQuarterBegin(n=-1, startingMonth=1)
@@ -718,9 +718,9 @@ def test_offset(self):
718718
datetime(2008, 4, 15): datetime(2008, 7, 31),
719719
datetime(2008, 4, 30): datetime(2008, 10, 31),}))
720720

721-
for dateOffset, cases in tests:
722-
for baseDate, expected in cases.iteritems():
723-
assertEq(dateOffset, baseDate, expected)
721+
for offset, cases in tests:
722+
for base, expected in cases.iteritems():
723+
assertEq(offset, base, expected)
724724

725725
# corner
726726
offset = BQuarterEnd(n=-1, startingMonth=1)
@@ -822,9 +822,9 @@ def test_offset(self):
822822
datetime(2008, 4, 15): datetime(2008, 10, 1),
823823
datetime(2008, 4, 1): datetime(2008, 10, 1),}))
824824

825-
for dateOffset, cases in tests:
826-
for baseDate, expected in cases.iteritems():
827-
assertEq(dateOffset, baseDate, expected)
825+
for offset, cases in tests:
826+
for base, expected in cases.iteritems():
827+
assertEq(offset, base, expected)
828828

829829
# corner
830830
offset = QuarterBegin(n=-1, startingMonth=1)
@@ -890,9 +890,9 @@ def test_offset(self):
890890
datetime(2008, 4, 15): datetime(2008, 7, 31),
891891
datetime(2008, 4, 30): datetime(2008, 10, 31),}))
892892

893-
for dateOffset, cases in tests:
894-
for baseDate, expected in cases.iteritems():
895-
assertEq(dateOffset, baseDate, expected)
893+
for offset, cases in tests:
894+
for base, expected in cases.iteritems():
895+
assertEq(offset, base, expected)
896896

897897
# corner
898898
offset = QuarterEnd(n=-1, startingMonth=1)
@@ -974,9 +974,9 @@ def test_offset(self):
974974
datetime(2007, 6, 30): datetime(2006, 1, 2),
975975
datetime(2008, 12, 31): datetime(2007, 1, 1),}))
976976

977-
for dateOffset, cases in tests:
978-
for baseDate, expected in cases.iteritems():
979-
assertEq(dateOffset, baseDate, expected)
977+
for offset, cases in tests:
978+
for base, expected in cases.iteritems():
979+
assertEq(offset, base, expected)
980980

981981

982982
class TestYearBegin(unittest.TestCase):
@@ -1012,9 +1012,9 @@ def test_offset(self):
10121012
datetime(2008, 6, 30): datetime(2007, 1, 1),
10131013
datetime(2008, 12, 31): datetime(2007, 1, 1),}))
10141014

1015-
for dateOffset, cases in tests:
1016-
for baseDate, expected in cases.iteritems():
1017-
assertEq(dateOffset, baseDate, expected)
1015+
for offset, cases in tests:
1016+
for base, expected in cases.iteritems():
1017+
assertEq(offset, base, expected)
10181018

10191019

10201020
def test_onOffset(self):
@@ -1048,9 +1048,9 @@ def test_offset(self):
10481048
datetime(2007, 6, 30): datetime(2007, 6, 29)},
10491049
))
10501050

1051-
for dateOffset, cases in tests:
1052-
for baseDate, expected in cases.iteritems():
1053-
self.assertEqual(baseDate + dateOffset, expected)
1051+
for offset, cases in tests:
1052+
for base, expected in cases.iteritems():
1053+
self.assertEqual(base + offset, expected)
10541054

10551055
def test_roll(self):
10561056
offset = BYearEnd(month=6)
@@ -1100,9 +1100,9 @@ def test_offset(self):
11001100
datetime(2008, 6, 30): datetime(2006, 12, 29),
11011101
datetime(2008, 12, 31): datetime(2006, 12, 29),}))
11021102

1103-
for dateOffset, cases in tests:
1104-
for baseDate, expected in cases.iteritems():
1105-
assertEq(dateOffset, baseDate, expected)
1103+
for offset, cases in tests:
1104+
for base, expected in cases.iteritems():
1105+
assertEq(offset, base, expected)
11061106

11071107
def test_onOffset(self):
11081108

@@ -1147,9 +1147,9 @@ def test_offset(self):
11471147
datetime(2008, 6, 30): datetime(2006, 12, 31),
11481148
datetime(2008, 12, 31): datetime(2006, 12, 31),}))
11491149

1150-
for dateOffset, cases in tests:
1151-
for baseDate, expected in cases.iteritems():
1152-
assertEq(dateOffset, baseDate, expected)
1150+
for offset, cases in tests:
1151+
for base, expected in cases.iteritems():
1152+
assertEq(offset, base, expected)
11531153

11541154
def test_onOffset(self):
11551155

@@ -1191,12 +1191,12 @@ def test_offset(self):
11911191

11921192
tests.append((YearEnd(-2, month=3),
11931193
{datetime(2007, 1, 1): datetime(2005, 3, 31),
1194-
datetime(2008, 6, 30): datetime(2006, 3, 31),
1194+
datetime(2008, 6, 30): datetime(2007, 3, 31),
11951195
datetime(2008, 3, 31): datetime(2006, 3, 31),}))
11961196

1197-
for dateOffset, cases in tests:
1198-
for baseDate, expected in cases.iteritems():
1199-
assertEq(dateOffset, baseDate, expected)
1197+
for offset, cases in tests:
1198+
for base, expected in cases.iteritems():
1199+
assertEq(offset, base, expected)
12001200

12011201
def test_onOffset(self):
12021202

@@ -1210,14 +1210,14 @@ def test_onOffset(self):
12101210
for offset, date, expected in tests:
12111211
assertOnOffset(offset, date, expected)
12121212

1213-
def assertEq(dateOffset, baseDate, expected):
1214-
actual = dateOffset + baseDate
1213+
def assertEq(offset, base, expected):
1214+
actual = offset + base
12151215
try:
12161216
assert actual == expected
12171217
except AssertionError as err:
12181218
raise AssertionError("\nExpected: %s\nActual: %s\nFor Offset: %s)"
12191219
"\nAt Date: %s"%
1220-
(expected, actual, dateOffset, baseDate))
1220+
(expected, actual, offset, base))
12211221

12221222
def test_Hour():
12231223
assertEq(Hour(), datetime(2010, 1, 1), datetime(2010, 1, 1, 1))
@@ -1249,25 +1249,6 @@ def test_Second():
12491249
assert (Second(3) + Second(2)) == Second(5)
12501250
assert (Second(3) - Second(2)) == Second()
12511251

1252-
def test_inferTimeRule():
1253-
index1 = [datetime(2010, 1, 29, 0, 0),
1254-
datetime(2010, 2, 26, 0, 0),
1255-
datetime(2010, 3, 31, 0, 0)]
1256-
1257-
index2 = [datetime(2010, 3, 26, 0, 0),
1258-
datetime(2010, 3, 29, 0, 0),
1259-
datetime(2010, 3, 30, 0, 0)]
1260-
1261-
index3 = [datetime(2010, 3, 26, 0, 0),
1262-
datetime(2010, 3, 27, 0, 0),
1263-
datetime(2010, 3, 29, 0, 0)]
1264-
1265-
assert inferTimeRule(index1) == 'BM'
1266-
assert inferTimeRule(index2) == 'B'
1267-
1268-
assert_raises(Exception, inferTimeRule, index1[:2])
1269-
assert_raises(Exception, inferTimeRule, index3)
1270-
12711252
def test_hasOffsetName():
12721253
assert hasOffsetName(BDay())
12731254
assert not hasOffsetName(BDay(2))

0 commit comments

Comments
 (0)