Skip to content

Commit 8d599a4

Browse files
committed
TST: unit test for frequency inference function
1 parent 9725fe7 commit 8d599a4

File tree

2 files changed

+139
-0
lines changed

2 files changed

+139
-0
lines changed

pandas/tseries/index.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from pandas.core.index import Index, Int64Index
77
from pandas.tseries.tools import parse_time_string
8+
from pandas.util.decorators import cache_readonly
89
import pandas.core.common as com
910
import pandas.core.datetools as datetools
1011
import pandas.tseries.tools as tools
@@ -838,6 +839,11 @@ def map(self, f):
838839
def freq(self):
839840
return self.offset
840841

842+
@cache_readonly
843+
def inferred_freq(self):
844+
import pandas._sandbox as sbx
845+
return sbx.infer_freq(self.asi8)
846+
841847
@property
842848
def freqstr(self):
843849
return self.offset.freqstr
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
from datetime import datetime, time, timedelta
2+
import sys
3+
import os
4+
import unittest
5+
6+
import nose
7+
8+
import numpy as np
9+
10+
from pandas import Index, DatetimeIndex, date_range
11+
12+
from pandas.tseries.frequencies import to_offset
13+
import pandas.tseries.offsets as offsets
14+
15+
import pandas._tseries as lib
16+
17+
def test_to_offset_multiple():
18+
freqstr = '2h30min'
19+
freqstr2 = '2h 30min'
20+
21+
result = to_offset(freqstr)
22+
assert(result == to_offset(freqstr2))
23+
expected = offsets.Minute(150)
24+
assert(result == expected)
25+
26+
freqstr = '2h30min15s'
27+
result = to_offset(freqstr)
28+
expected = offsets.Second(150 * 60 + 15)
29+
assert(result == expected)
30+
31+
freqstr = '2h 60min'
32+
result = to_offset(freqstr)
33+
expected = offsets.Hour(3)
34+
assert(result == expected)
35+
36+
freqstr = '15l500u'
37+
result = to_offset(freqstr)
38+
expected = offsets.Micro(15500)
39+
assert(result == expected)
40+
41+
freqstr = '10s75L'
42+
result = to_offset(freqstr)
43+
expected = offsets.Milli(10075)
44+
assert(result == expected)
45+
46+
_dti = DatetimeIndex
47+
48+
class TestFrequencyInference(unittest.TestCase):
49+
50+
def test_business_daily(self):
51+
index = _dti(['12/31/1999', '1/3/1999'])
52+
self.assert_(index.inferred_freq == 'B')
53+
54+
def test_day(self):
55+
self._check_tick(timedelta(1), 'D')
56+
57+
def test_day_corner(self):
58+
index = _dti(['1/1/2000', '1/2/2000'])
59+
self.assert_(index.inferred_freq == 'D')
60+
61+
def test_hour(self):
62+
self._check_tick(timedelta(hours=1), 'H')
63+
64+
def test_minute(self):
65+
self._check_tick(timedelta(minutes=1), 'T')
66+
67+
def test_second(self):
68+
self._check_tick(timedelta(seconds=1), 'S')
69+
70+
def test_millisecond(self):
71+
self._check_tick(timedelta(microseconds=1000), 'L')
72+
73+
def test_microsecond(self):
74+
self._check_tick(timedelta(microseconds=1), 'U')
75+
76+
def _check_tick(self, base_delta, code):
77+
b = datetime.now()
78+
for i in range(1, 5):
79+
inc = base_delta * i
80+
index = _dti([b + inc * j for j in range(3)])
81+
self.assert_(index.inferred_freq == '%d%s' % (i, code))
82+
83+
index = _dti([b + base_delta - 7] +
84+
[b + base_delta * j for j in range(3)])
85+
self.assert_(index.inferred_freq is None)
86+
87+
index = _dti([b + base_delta * j for j in range(3)] +
88+
[b + base_delta * 7])
89+
self.assert_(index.inferred_freq is None)
90+
91+
def test_weekly(self):
92+
days = ['MON', 'TUE', 'WED', 'THU', 'FRI']
93+
94+
for day in days:
95+
self._check_generated_range('1/1/2000', 'W-%s' % day)
96+
97+
def test_monthly(self):
98+
self._check_generated_range('1/1/2000', 'M')
99+
100+
def test_business_monthly(self):
101+
self._check_generated_range('1/1/2000', 'BM')
102+
103+
def test_quarterly(self):
104+
for month in ['JAN', 'FEB', 'MAR']:
105+
self._check_generated_range('1/1/2000', 'Q-%s' % month)
106+
107+
def test_annual(self):
108+
for month in MONTHS:
109+
self._check_generated_range('1/1/2000', 'A-%s' % month)
110+
111+
def test_business_annual(self):
112+
for month in MONTHS:
113+
self._check_generated_range('1/1/2000', 'BA-%s' % month)
114+
115+
def _check_generated_range(self, start, freq):
116+
freq = freq.upper()
117+
118+
gen = date_range(start, periods=3, freq=freq)
119+
index = _dti(gen.values)
120+
self.assert_(index.inferred_freq == gen.freq)
121+
122+
gen = date_range(start, periods=5, freq=freq)
123+
index = _dti(gen.values)
124+
self.assert_(index.inferred_freq == gen.freq)
125+
126+
MONTHS = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP',
127+
'OCT', 'NOV', 'DEC']
128+
129+
if __name__ == '__main__':
130+
import nose
131+
nose.runmodule(argv=[__file__,'-vvs','-x','--pdb', '--pdb-failure'],
132+
exit=False)
133+

0 commit comments

Comments
 (0)