Skip to content

Commit 54c0a1a

Browse files
committed
TST: finish test coverage of pandas.tseries.index #1245
1 parent 48d8d9d commit 54c0a1a

File tree

6 files changed

+60
-59
lines changed

6 files changed

+60
-59
lines changed

pandas/core/index.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2471,9 +2471,9 @@ def _ensure_compat_concat(indexes):
24712471
return indexes
24722472

24732473
def _maybe_box_dtindex(idx):
2474-
from pandas.tseries.index import DatetimeIndex, _dt_box_array
2474+
from pandas.tseries.index import DatetimeIndex
24752475
if isinstance(idx, DatetimeIndex):
2476-
return Index(_dt_box_array(idx.asi8), dtype='object')
2476+
return idx.asobject
24772477
return idx
24782478

24792479
def _clean_arrays(values):

pandas/tseries/index.py

+7-50
Original file line numberDiff line numberDiff line change
@@ -322,8 +322,7 @@ def _cached_range(cls, start=None, end=None, periods=None, offset=None,
322322
xdr = generate_range(offset=offset, start=_CACHE_START,
323323
end=_CACHE_END)
324324

325-
arr = np.array(_to_m8_array(list(xdr)),
326-
dtype=_NS_DTYPE, copy=False)
325+
arr = tools.to_datetime(list(xdr), box=False)
327326

328327
cachedRange = arr.view(DatetimeIndex)
329328
cachedRange.offset = offset
@@ -538,7 +537,8 @@ def tolist(self):
538537
return list(self.asobject)
539538

540539
def _get_object_index(self):
541-
boxed_values = _dt_box_array(self.asi8, self.offset, self.tz)
540+
boxfunc = lambda x: Timestamp(x, offset=self.offset, tz=self.tz)
541+
boxed_values = lib.map_infer(self.asi8, boxfunc)
542542
return Index(boxed_values, dtype=object)
543543

544544
def to_pydatetime(self):
@@ -1046,10 +1046,6 @@ def inferred_type(self):
10461046
# sure we can't have ambiguous indexing
10471047
return 'datetime64'
10481048

1049-
@property
1050-
def _constructor(self):
1051-
return DatetimeIndex
1052-
10531049
@property
10541050
def dtype(self):
10551051
return _NS_DTYPE
@@ -1108,10 +1104,10 @@ def insert(self, loc, item):
11081104
if type(item) == datetime:
11091105
item = _to_m8(item)
11101106

1111-
if self.offset is not None and not self.offset.onOffset(item):
1112-
raise ValueError("Cannot insert value at non-conforming time")
1113-
1114-
return super(DatetimeIndex, self).insert(loc, item)
1107+
new_index = np.concatenate((self[:loc].asi8,
1108+
[item.view(np.int64)],
1109+
self[loc:].asi8))
1110+
return DatetimeIndex(new_index, freq='infer')
11151111

11161112
def _view_like(self, ndarray):
11171113
result = ndarray.view(type(self))
@@ -1156,29 +1152,6 @@ def tz_localize(self, tz):
11561152

11571153
return self._simple_new(new_dates, self.name, self.offset, tz)
11581154

1159-
def tz_validate(self):
1160-
"""
1161-
For a localized time zone, verify that there are no DST ambiguities
1162-
(using pytz)
1163-
1164-
Returns
1165-
-------
1166-
result : boolean
1167-
True if there are no DST ambiguities
1168-
"""
1169-
import pytz
1170-
1171-
if self.tz is None or self.tz is pytz.utc:
1172-
return True
1173-
1174-
# See if there are any DST resolution problems
1175-
try:
1176-
lib.tz_localize_check(self.asi8, self.tz)
1177-
except:
1178-
return False
1179-
1180-
return True
1181-
11821155
def indexer_at_time(self, time, asof=False):
11831156
"""
11841157
Select values at particular time of day (e.g. 9:30AM)
@@ -1353,17 +1326,6 @@ def bdate_range(start=None, end=None, periods=None, freq='B', tz=None,
13531326
freq=freq, tz=tz, normalize=normalize)
13541327

13551328

1356-
def _dt_box_array(arr, offset=None, tz=None):
1357-
if arr is None:
1358-
return arr
1359-
1360-
if not isinstance(arr, np.ndarray):
1361-
return arr
1362-
1363-
boxfunc = lambda x: Timestamp(x, offset=offset, tz=tz)
1364-
return lib.map_infer(arr, boxfunc)
1365-
1366-
13671329
def _to_m8(key):
13681330
'''
13691331
Timestamp-like => dt64
@@ -1375,11 +1337,6 @@ def _to_m8(key):
13751337
return np.int64(lib.pydt_to_i8(key)).view(_NS_DTYPE)
13761338

13771339

1378-
def _to_m8_array(arr):
1379-
if arr is None:
1380-
return arr
1381-
return np.frompyfunc(_to_m8, 1, 1)(arr)
1382-
13831340

13841341
def _str_to_dt_array(arr, offset=None):
13851342
def parser(x):

pandas/tseries/tests/test_timeseries.py

+36-1
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,8 @@ def test_promote_datetime_date(self):
670670
rng = date_range('1/1/2000', periods=20)
671671
ts = Series(np.random.randn(20), index=rng)
672672

673-
ts2 = ts[5:]
673+
ts_slice = ts[5:]
674+
ts2 = ts_slice.copy()
674675
ts2.index = [x.date() for x in ts2.index]
675676

676677
result = ts + ts2
@@ -684,6 +685,10 @@ def test_promote_datetime_date(self):
684685
expected = ts[5:].asfreq('4H', method='ffill')
685686
assert_series_equal(result, expected)
686687

688+
result = rng.get_indexer(ts2.index)
689+
expected = rng.get_indexer(ts_slice.index)
690+
self.assert_(np.array_equal(result, expected))
691+
687692
def test_date_range_gen_error(self):
688693
rng = date_range('1/1/2000 00:00', '1/1/2000 00:18', freq='5min')
689694
self.assertEquals(len(rng), 4)
@@ -756,6 +761,10 @@ def test_at_time(self):
756761
self.assert_((rs.index.minute == rng[1].minute).all())
757762
self.assert_((rs.index.second == rng[1].second).all())
758763

764+
result = ts.at_time('9:30')
765+
expected = ts.at_time(time(9, 30))
766+
assert_series_equal(result, expected)
767+
759768
df = DataFrame(np.random.randn(len(rng), 3), index=rng)
760769

761770
result = ts[time(9, 30)]
@@ -808,6 +817,10 @@ def test_between_time(self):
808817
else:
809818
self.assert_(t < etime)
810819

820+
result = ts.between_time('00:00', '01:00')
821+
expected = ts.between_time(stime, etime)
822+
assert_series_equal(result, expected)
823+
811824
def test_dti_constructor_preserve_dti_freq(self):
812825
rng = date_range('1/1/2000', '1/2/2000', freq='5min')
813826

@@ -1056,6 +1069,12 @@ def test_misc_coverage(self):
10561069
result = rng.groupby(rng.day)
10571070
self.assert_(isinstance(result.values()[0][0], Timestamp))
10581071

1072+
idx = DatetimeIndex(['2000-01-03', '2000-01-01', '2000-01-02'])
1073+
self.assert_(idx.equals(list(idx)))
1074+
1075+
non_datetime = Index(list('abc'))
1076+
self.assert_(not idx.equals(list(non_datetime)))
1077+
10591078
def test_union_coverage(self):
10601079
idx = DatetimeIndex(['2000-01-03', '2000-01-01', '2000-01-02'])
10611080
ordered = DatetimeIndex(idx.order(), freq='infer')
@@ -1082,6 +1101,11 @@ def test_get_duplicates(self):
10821101
ex = DatetimeIndex(['2000-01-02', '2000-01-03'])
10831102
self.assert_(result.equals(ex))
10841103

1104+
def test_argmin_argmax(self):
1105+
idx = DatetimeIndex(['2000-01-04', '2000-01-01', '2000-01-02'])
1106+
self.assertEqual(idx.argmin(), 1)
1107+
self.assertEqual(idx.argmax(), 0)
1108+
10851109
def test_order(self):
10861110
idx = DatetimeIndex(['2000-01-04', '2000-01-01', '2000-01-02'])
10871111

@@ -1099,6 +1123,17 @@ def test_order(self):
10991123
self.assert_(ordered[::-1].is_monotonic)
11001124
self.assert_(np.array_equal(dexer, [0, 2, 1]))
11011125

1126+
def test_insert(self):
1127+
idx = DatetimeIndex(['2000-01-04', '2000-01-01', '2000-01-02'])
1128+
1129+
result = idx.insert(2, datetime(2000, 1, 5))
1130+
exp = DatetimeIndex(['2000-01-04', '2000-01-01', '2000-01-05',
1131+
'2000-01-02'])
1132+
self.assert_(result.equals(exp))
1133+
1134+
idx = date_range('1/1/2000', periods=3, freq='M')
1135+
result = idx.insert(3, datetime(2000, 4, 30))
1136+
self.assert_(result.freqstr == 'M')
11021137

11031138
class TestLegacySupport(unittest.TestCase):
11041139

pandas/tseries/tests/test_timezones.py

+11-3
Original file line numberDiff line numberDiff line change
@@ -245,9 +245,6 @@ def test_with_tz_ambiguous_times(self):
245245

246246
rng = bdate_range(datetime(2009, 1, 1), datetime(2010, 1, 1))
247247

248-
# regular no problem
249-
self.assert_(rng.tz_validate())
250-
251248
# March 13, 2011, spring forward, skip from 2 AM to 3 AM
252249
dr = date_range(datetime(2011, 3, 13, 1, 30), periods=3,
253250
freq=datetools.Hour())
@@ -370,6 +367,7 @@ def test_tz_localize_naive(self):
370367
self.assert_(conv.equals(exp))
371368

372369
def test_series_frame_tz_localize(self):
370+
373371
rng = date_range('1/1/2011', periods=100, freq='H')
374372
ts = Series(1, index=rng)
375373

@@ -387,6 +385,11 @@ def test_series_frame_tz_localize(self):
387385
self.assert_(result.columns.tz.zone == 'UTC')
388386
assert_frame_equal(result, expected.T)
389387

388+
# Can't localize if already tz-aware
389+
rng = date_range('1/1/2011', periods=100, freq='H', tz='utc')
390+
ts = Series(1, index=rng)
391+
self.assertRaises(Exception, ts.tz_localize, 'US/Eastern')
392+
390393
def test_series_frame_tz_convert(self):
391394
rng = date_range('1/1/2011', periods=200, freq='D',
392395
tz='US/Eastern')
@@ -406,6 +409,11 @@ def test_series_frame_tz_convert(self):
406409
self.assert_(result.columns.tz.zone == 'Europe/Berlin')
407410
assert_frame_equal(result, expected.T)
408411

412+
# can't convert tz-naive
413+
rng = date_range('1/1/2011', periods=200, freq='D')
414+
ts = Series(1, index=rng)
415+
self.assertRaises(Exception, ts.tz_convert, 'US/Eastern')
416+
409417
def test_join_utc_convert(self):
410418
rng = date_range('1/1/2011', periods=100, freq='H', tz='utc')
411419

pandas/tseries/tools.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def _figure_out_timezone(start, end, tzinfo):
6565
return start, end, tz
6666

6767

68-
def to_datetime(arg, errors='ignore', dayfirst=False):
68+
def to_datetime(arg, errors='ignore', dayfirst=False, box=True):
6969
"""
7070
Convert argument to datetime
7171
@@ -96,7 +96,7 @@ def to_datetime(arg, errors='ignore', dayfirst=False):
9696
result = lib.array_to_datetime(com._ensure_object(arg),
9797
raise_=errors == 'raise',
9898
dayfirst=dayfirst)
99-
if com.is_datetime64_dtype(result):
99+
if com.is_datetime64_dtype(result) and box:
100100
result = DatetimeIndex(result)
101101
return result
102102
try:

test.sh

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
coverage erase
33
# nosetests pandas/tests/test_index.py --with-coverage --cover-package=pandas.core --pdb-failure --pdb
44
#nosetests -w pandas --with-coverage --cover-package=pandas --pdb-failure --pdb #--cover-inclusive
5-
nosetests -A "not slow" -w pandas/tseries --with-coverage --cover-package=pandas.tseries $* #--cover-inclusive
5+
#nosetests -A "not slow" -w pandas/tseries --with-coverage --cover-package=pandas.tseries $* #--cover-inclusive
6+
nosetests -w pandas --with-coverage --cover-package=pandas $*
67
# nosetests -w pandas/io --with-coverage --cover-package=pandas.io --pdb-failure --pdb
78
# nosetests -w pandas/core --with-coverage --cover-package=pandas.core --pdb-failure --pdb
89
# nosetests -w pandas/stats --with-coverage --cover-package=pandas.stats

0 commit comments

Comments
 (0)