Skip to content

Commit c5342fd

Browse files
jrebackAnkurDedania
authored andcommitted
TST: making test files a bit more balanced
TST: move parts of test_datetimelike.py to indexes/datetimes
1 parent 6ff9083 commit c5342fd

14 files changed

+638
-604
lines changed

pandas/sparse/tests/test_frame.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,50 @@ def test_fillna_fill_value(self):
705705
tm.assert_frame_equal(sparse.fillna(-1).to_dense(),
706706
df.fillna(-1), check_dtype=False)
707707

708+
def test_sparse_frame_pad_backfill_limit(self):
709+
index = np.arange(10)
710+
df = DataFrame(np.random.randn(10, 4), index=index)
711+
sdf = df.to_sparse()
712+
713+
result = sdf[:2].reindex(index, method='pad', limit=5)
714+
715+
expected = sdf[:2].reindex(index).fillna(method='pad')
716+
expected = expected.to_dense()
717+
expected.values[-3:] = np.nan
718+
expected = expected.to_sparse()
719+
tm.assert_frame_equal(result, expected)
720+
721+
result = sdf[-2:].reindex(index, method='backfill', limit=5)
722+
723+
expected = sdf[-2:].reindex(index).fillna(method='backfill')
724+
expected = expected.to_dense()
725+
expected.values[:3] = np.nan
726+
expected = expected.to_sparse()
727+
tm.assert_frame_equal(result, expected)
728+
729+
def test_sparse_frame_fillna_limit(self):
730+
index = np.arange(10)
731+
df = DataFrame(np.random.randn(10, 4), index=index)
732+
sdf = df.to_sparse()
733+
734+
result = sdf[:2].reindex(index)
735+
result = result.fillna(method='pad', limit=5)
736+
737+
expected = sdf[:2].reindex(index).fillna(method='pad')
738+
expected = expected.to_dense()
739+
expected.values[-3:] = np.nan
740+
expected = expected.to_sparse()
741+
tm.assert_frame_equal(result, expected)
742+
743+
result = sdf[-2:].reindex(index)
744+
result = result.fillna(method='backfill', limit=5)
745+
746+
expected = sdf[-2:].reindex(index).fillna(method='backfill')
747+
expected = expected.to_dense()
748+
expected.values[:3] = np.nan
749+
expected = expected.to_sparse()
750+
tm.assert_frame_equal(result, expected)
751+
708752
def test_rename(self):
709753
# just check this works
710754
renamed = self.frame.rename(index=str) # noqa

pandas/tests/frame/test_missing.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,40 @@ def test_bfill(self):
322322
assert_frame_equal(self.tsframe.bfill(),
323323
self.tsframe.fillna(method='bfill'))
324324

325+
def test_frame_pad_backfill_limit(self):
326+
index = np.arange(10)
327+
df = DataFrame(np.random.randn(10, 4), index=index)
328+
329+
result = df[:2].reindex(index, method='pad', limit=5)
330+
331+
expected = df[:2].reindex(index).fillna(method='pad')
332+
expected.values[-3:] = np.nan
333+
tm.assert_frame_equal(result, expected)
334+
335+
result = df[-2:].reindex(index, method='backfill', limit=5)
336+
337+
expected = df[-2:].reindex(index).fillna(method='backfill')
338+
expected.values[:3] = np.nan
339+
tm.assert_frame_equal(result, expected)
340+
341+
def test_frame_fillna_limit(self):
342+
index = np.arange(10)
343+
df = DataFrame(np.random.randn(10, 4), index=index)
344+
345+
result = df[:2].reindex(index)
346+
result = result.fillna(method='pad', limit=5)
347+
348+
expected = df[:2].reindex(index).fillna(method='pad')
349+
expected.values[-3:] = np.nan
350+
tm.assert_frame_equal(result, expected)
351+
352+
result = df[-2:].reindex(index)
353+
result = result.fillna(method='backfill', limit=5)
354+
355+
expected = df[-2:].reindex(index).fillna(method='backfill')
356+
expected.values[:3] = np.nan
357+
tm.assert_frame_equal(result, expected)
358+
325359
def test_fillna_skip_certain_blocks(self):
326360
# don't try to fill boolean, int blocks
327361

pandas/tests/frame/test_timeseries.py

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
from numpy.random import randn
99
import numpy as np
1010

11-
from pandas import DataFrame, Series, Index, Timestamp, DatetimeIndex
11+
from pandas import (DataFrame, Series, Index,
12+
Timestamp, DatetimeIndex,
13+
to_datetime, date_range)
1214
import pandas as pd
1315
import pandas.tseries.offsets as offsets
1416

@@ -117,6 +119,60 @@ def test_pct_change_shift_over_nas(self):
117119
edf = DataFrame({'a': expected, 'b': expected})
118120
assert_frame_equal(chg, edf)
119121

122+
def test_frame_ctor_datetime64_column(self):
123+
rng = date_range('1/1/2000 00:00:00', '1/1/2000 1:59:50', freq='10s')
124+
dates = np.asarray(rng)
125+
126+
df = DataFrame({'A': np.random.randn(len(rng)), 'B': dates})
127+
self.assertTrue(np.issubdtype(df['B'].dtype, np.dtype('M8[ns]')))
128+
129+
def test_frame_add_datetime64_column(self):
130+
rng = date_range('1/1/2000 00:00:00', '1/1/2000 1:59:50', freq='10s')
131+
df = DataFrame(index=np.arange(len(rng)))
132+
133+
df['A'] = rng
134+
self.assertTrue(np.issubdtype(df['A'].dtype, np.dtype('M8[ns]')))
135+
136+
def test_frame_datetime64_pre1900_repr(self):
137+
df = DataFrame({'year': date_range('1/1/1700', periods=50,
138+
freq='A-DEC')})
139+
# it works!
140+
repr(df)
141+
142+
def test_frame_add_datetime64_col_other_units(self):
143+
n = 100
144+
145+
units = ['h', 'm', 's', 'ms', 'D', 'M', 'Y']
146+
147+
ns_dtype = np.dtype('M8[ns]')
148+
149+
for unit in units:
150+
dtype = np.dtype('M8[%s]' % unit)
151+
vals = np.arange(n, dtype=np.int64).view(dtype)
152+
153+
df = DataFrame({'ints': np.arange(n)}, index=np.arange(n))
154+
df[unit] = vals
155+
156+
ex_vals = to_datetime(vals.astype('O')).values
157+
158+
self.assertEqual(df[unit].dtype, ns_dtype)
159+
self.assertTrue((df[unit].values == ex_vals).all())
160+
161+
# Test insertion into existing datetime64 column
162+
df = DataFrame({'ints': np.arange(n)}, index=np.arange(n))
163+
df['dates'] = np.arange(n, dtype=np.int64).view(ns_dtype)
164+
165+
for unit in units:
166+
dtype = np.dtype('M8[%s]' % unit)
167+
vals = np.arange(n, dtype=np.int64).view(dtype)
168+
169+
tmp = df.copy()
170+
171+
tmp['dates'] = vals
172+
ex_vals = to_datetime(vals.astype('O')).values
173+
174+
self.assertTrue((tmp['dates'].values == ex_vals).all())
175+
120176
def test_shift(self):
121177
# naive shift
122178
shiftedFrame = self.tsframe.shift(5)

pandas/tests/indexes/datetimelike.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
""" generic datetimelike tests """
2+
3+
from .common import Base
4+
import pandas.util.testing as tm
5+
6+
7+
class DatetimeLike(Base):
8+
9+
def test_shift_identity(self):
10+
11+
idx = self.create_index()
12+
self.assert_index_equal(idx, idx.shift(0))
13+
14+
def test_str(self):
15+
16+
# test the string repr
17+
idx = self.create_index()
18+
idx.name = 'foo'
19+
self.assertFalse("length=%s" % len(idx) in str(idx))
20+
self.assertTrue("'foo'" in str(idx))
21+
self.assertTrue(idx.__class__.__name__ in str(idx))
22+
23+
if hasattr(idx, 'tz'):
24+
if idx.tz is not None:
25+
self.assertTrue(idx.tz in str(idx))
26+
if hasattr(idx, 'freq'):
27+
self.assertTrue("freq='%s'" % idx.freqstr in str(idx))
28+
29+
def test_view(self):
30+
super(DatetimeLike, self).test_view()
31+
32+
i = self.create_index()
33+
34+
i_view = i.view('i8')
35+
result = self._holder(i)
36+
tm.assert_index_equal(result, i)
37+
38+
i_view = i.view(self._holder)
39+
result = self._holder(i)
40+
tm.assert_index_equal(result, i_view)

pandas/tests/indexes/datetimes/test_astype.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import numpy as np
22

3+
from datetime import datetime
34
import pandas as pd
45
import pandas.util.testing as tm
56
from pandas import (DatetimeIndex, date_range, Series, NaT, Index, Timestamp,
@@ -120,3 +121,64 @@ def test_astype_raises(self):
120121
self.assertRaises(ValueError, idx.astype, 'timedelta64[ns]')
121122
self.assertRaises(ValueError, idx.astype, 'datetime64')
122123
self.assertRaises(ValueError, idx.astype, 'datetime64[D]')
124+
125+
def test_index_convert_to_datetime_array(self):
126+
tm._skip_if_no_pytz()
127+
128+
def _check_rng(rng):
129+
converted = rng.to_pydatetime()
130+
tm.assertIsInstance(converted, np.ndarray)
131+
for x, stamp in zip(converted, rng):
132+
tm.assertIsInstance(x, datetime)
133+
self.assertEqual(x, stamp.to_pydatetime())
134+
self.assertEqual(x.tzinfo, stamp.tzinfo)
135+
136+
rng = date_range('20090415', '20090519')
137+
rng_eastern = date_range('20090415', '20090519', tz='US/Eastern')
138+
rng_utc = date_range('20090415', '20090519', tz='utc')
139+
140+
_check_rng(rng)
141+
_check_rng(rng_eastern)
142+
_check_rng(rng_utc)
143+
144+
def test_index_convert_to_datetime_array_explicit_pytz(self):
145+
tm._skip_if_no_pytz()
146+
import pytz
147+
148+
def _check_rng(rng):
149+
converted = rng.to_pydatetime()
150+
tm.assertIsInstance(converted, np.ndarray)
151+
for x, stamp in zip(converted, rng):
152+
tm.assertIsInstance(x, datetime)
153+
self.assertEqual(x, stamp.to_pydatetime())
154+
self.assertEqual(x.tzinfo, stamp.tzinfo)
155+
156+
rng = date_range('20090415', '20090519')
157+
rng_eastern = date_range('20090415', '20090519',
158+
tz=pytz.timezone('US/Eastern'))
159+
rng_utc = date_range('20090415', '20090519', tz=pytz.utc)
160+
161+
_check_rng(rng)
162+
_check_rng(rng_eastern)
163+
_check_rng(rng_utc)
164+
165+
def test_index_convert_to_datetime_array_dateutil(self):
166+
tm._skip_if_no_dateutil()
167+
import dateutil
168+
169+
def _check_rng(rng):
170+
converted = rng.to_pydatetime()
171+
tm.assertIsInstance(converted, np.ndarray)
172+
for x, stamp in zip(converted, rng):
173+
tm.assertIsInstance(x, datetime)
174+
self.assertEqual(x, stamp.to_pydatetime())
175+
self.assertEqual(x.tzinfo, stamp.tzinfo)
176+
177+
rng = date_range('20090415', '20090519')
178+
rng_eastern = date_range('20090415', '20090519',
179+
tz='dateutil/US/Eastern')
180+
rng_utc = date_range('20090415', '20090519', tz=dateutil.tz.tzutc())
181+
182+
_check_rng(rng)
183+
_check_rng(rng_eastern)
184+
_check_rng(rng_utc)

pandas/tests/indexes/datetimes/test_construction.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from datetime import timedelta
33

44
import pandas as pd
5+
from pandas import tslib
56
import pandas.util.testing as tm
67
from pandas.tslib import OutOfBoundsDatetime
78
from pandas import (DatetimeIndex, Index, Timestamp, datetime, date_range,
@@ -477,6 +478,22 @@ def test_dti_constructor_numpy_timeunits(self):
477478
tm.assert_index_equal(DatetimeIndex(values), base)
478479
tm.assert_index_equal(to_datetime(values), base)
479480

481+
def test_ctor_str_intraday(self):
482+
rng = DatetimeIndex(['1-1-2000 00:00:01'])
483+
self.assertEqual(rng[0].second, 1)
484+
485+
def test_is_(self):
486+
dti = DatetimeIndex(start='1/1/2005', end='12/1/2005', freq='M')
487+
self.assertTrue(dti.is_(dti))
488+
self.assertTrue(dti.is_(dti.view()))
489+
self.assertFalse(dti.is_(dti.copy()))
490+
491+
def test_index_cast_datetime64_other_units(self):
492+
arr = np.arange(0, 100, 10, dtype=np.int64).view('M8[D]')
493+
idx = Index(arr)
494+
495+
self.assertTrue((idx.values == tslib.cast_to_nanoseconds(arr)).all())
496+
480497
def test_constructor_int64_nocopy(self):
481498
# #1624
482499
arr = np.arange(1000, dtype=np.int64)

pandas/tests/indexes/datetimes/test_datetime.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,14 @@ def test_get_indexer(self):
9494
with tm.assertRaises(ValueError):
9595
idx.get_indexer(idx[[0]], method='nearest', tolerance='foo')
9696

97+
def test_reasonable_keyerror(self):
98+
# GH #1062
99+
index = DatetimeIndex(['1/3/2000'])
100+
try:
101+
index.get_loc('1/1/2000')
102+
except KeyError as e:
103+
self.assertIn('2000', str(e))
104+
97105
def test_roundtrip_pickle_with_tz(self):
98106

99107
# GH 8367
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
""" generic tests from the Datetimelike class """
2+
3+
import numpy as np
4+
import pandas as pd
5+
from pandas.util import testing as tm
6+
from pandas import Series, Index, DatetimeIndex, date_range
7+
8+
from ..datetimelike import DatetimeLike
9+
10+
class TestDatetimeIndex(DatetimeLike, tm.TestCase):
11+
_holder = DatetimeIndex
12+
_multiprocess_can_split_ = True
13+
14+
def setUp(self):
15+
self.indices = dict(index=tm.makeDateIndex(10))
16+
self.setup_indices()
17+
18+
def create_index(self):
19+
return date_range('20130101', periods=5)
20+
21+
def test_shift(self):
22+
23+
# test shift for datetimeIndex and non datetimeIndex
24+
# GH8083
25+
26+
drange = self.create_index()
27+
result = drange.shift(1)
28+
expected = DatetimeIndex(['2013-01-02', '2013-01-03', '2013-01-04',
29+
'2013-01-05',
30+
'2013-01-06'], freq='D')
31+
self.assert_index_equal(result, expected)
32+
33+
result = drange.shift(-1)
34+
expected = DatetimeIndex(['2012-12-31', '2013-01-01', '2013-01-02',
35+
'2013-01-03', '2013-01-04'],
36+
freq='D')
37+
self.assert_index_equal(result, expected)
38+
39+
result = drange.shift(3, freq='2D')
40+
expected = DatetimeIndex(['2013-01-07', '2013-01-08', '2013-01-09',
41+
'2013-01-10',
42+
'2013-01-11'], freq='D')
43+
self.assert_index_equal(result, expected)
44+
45+
def test_pickle_compat_construction(self):
46+
pass
47+
48+
def test_intersection(self):
49+
first = self.index
50+
second = self.index[5:]
51+
intersect = first.intersection(second)
52+
self.assertTrue(tm.equalContents(intersect, second))
53+
54+
# GH 10149
55+
cases = [klass(second.values) for klass in [np.array, Series, list]]
56+
for case in cases:
57+
result = first.intersection(case)
58+
self.assertTrue(tm.equalContents(result, second))
59+
60+
third = Index(['a', 'b', 'c'])
61+
result = first.intersection(third)
62+
expected = pd.Index([], dtype=object)
63+
self.assert_index_equal(result, expected)
64+
65+
def test_union(self):
66+
first = self.index[:5]
67+
second = self.index[5:]
68+
everything = self.index
69+
union = first.union(second)
70+
self.assertTrue(tm.equalContents(union, everything))
71+
72+
# GH 10149
73+
cases = [klass(second.values) for klass in [np.array, Series, list]]
74+
for case in cases:
75+
result = first.union(case)
76+
self.assertTrue(tm.equalContents(result, everything))

0 commit comments

Comments
 (0)