Skip to content

Commit d7c04fb

Browse files
jbrockmendeljreback
authored andcommitted
Index tests indexing (#18145)
1 parent c176a3c commit d7c04fb

File tree

8 files changed

+531
-516
lines changed

8 files changed

+531
-516
lines changed

pandas/tests/indexes/datetimes/test_datetime.py

-83
Original file line numberDiff line numberDiff line change
@@ -410,89 +410,6 @@ def test_sort_values(self):
410410
assert ordered[::-1].is_monotonic
411411
tm.assert_numpy_array_equal(dexer, np.array([0, 2, 1], dtype=np.intp))
412412

413-
def test_take(self):
414-
dates = [datetime(2010, 1, 1, 14), datetime(2010, 1, 1, 15),
415-
datetime(2010, 1, 1, 17), datetime(2010, 1, 1, 21)]
416-
417-
for tz in [None, 'US/Eastern', 'Asia/Tokyo']:
418-
idx = DatetimeIndex(start='2010-01-01 09:00',
419-
end='2010-02-01 09:00', freq='H', tz=tz,
420-
name='idx')
421-
expected = DatetimeIndex(dates, freq=None, name='idx', tz=tz)
422-
423-
taken1 = idx.take([5, 6, 8, 12])
424-
taken2 = idx[[5, 6, 8, 12]]
425-
426-
for taken in [taken1, taken2]:
427-
tm.assert_index_equal(taken, expected)
428-
assert isinstance(taken, DatetimeIndex)
429-
assert taken.freq is None
430-
assert taken.tz == expected.tz
431-
assert taken.name == expected.name
432-
433-
def test_take_fill_value(self):
434-
# GH 12631
435-
idx = pd.DatetimeIndex(['2011-01-01', '2011-02-01', '2011-03-01'],
436-
name='xxx')
437-
result = idx.take(np.array([1, 0, -1]))
438-
expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', '2011-03-01'],
439-
name='xxx')
440-
tm.assert_index_equal(result, expected)
441-
442-
# fill_value
443-
result = idx.take(np.array([1, 0, -1]), fill_value=True)
444-
expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', 'NaT'],
445-
name='xxx')
446-
tm.assert_index_equal(result, expected)
447-
448-
# allow_fill=False
449-
result = idx.take(np.array([1, 0, -1]), allow_fill=False,
450-
fill_value=True)
451-
expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', '2011-03-01'],
452-
name='xxx')
453-
tm.assert_index_equal(result, expected)
454-
455-
msg = ('When allow_fill=True and fill_value is not None, '
456-
'all indices must be >= -1')
457-
with tm.assert_raises_regex(ValueError, msg):
458-
idx.take(np.array([1, 0, -2]), fill_value=True)
459-
with tm.assert_raises_regex(ValueError, msg):
460-
idx.take(np.array([1, 0, -5]), fill_value=True)
461-
462-
with pytest.raises(IndexError):
463-
idx.take(np.array([1, -5]))
464-
465-
def test_take_fill_value_with_timezone(self):
466-
idx = pd.DatetimeIndex(['2011-01-01', '2011-02-01', '2011-03-01'],
467-
name='xxx', tz='US/Eastern')
468-
result = idx.take(np.array([1, 0, -1]))
469-
expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', '2011-03-01'],
470-
name='xxx', tz='US/Eastern')
471-
tm.assert_index_equal(result, expected)
472-
473-
# fill_value
474-
result = idx.take(np.array([1, 0, -1]), fill_value=True)
475-
expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', 'NaT'],
476-
name='xxx', tz='US/Eastern')
477-
tm.assert_index_equal(result, expected)
478-
479-
# allow_fill=False
480-
result = idx.take(np.array([1, 0, -1]), allow_fill=False,
481-
fill_value=True)
482-
expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', '2011-03-01'],
483-
name='xxx', tz='US/Eastern')
484-
tm.assert_index_equal(result, expected)
485-
486-
msg = ('When allow_fill=True and fill_value is not None, '
487-
'all indices must be >= -1')
488-
with tm.assert_raises_regex(ValueError, msg):
489-
idx.take(np.array([1, 0, -2]), fill_value=True)
490-
with tm.assert_raises_regex(ValueError, msg):
491-
idx.take(np.array([1, 0, -5]), fill_value=True)
492-
493-
with pytest.raises(IndexError):
494-
idx.take(np.array([1, -5]))
495-
496413
def test_map_bug_1677(self):
497414
index = DatetimeIndex(['2012-04-25 09:30:00.393000'])
498415
f = index.asof

pandas/tests/indexes/datetimes/test_indexing.py

+236-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1+
from datetime import datetime
12
import pytest
23

34
import pytz
45
import numpy as np
56
import pandas as pd
67
import pandas.util.testing as tm
78
import pandas.compat as compat
8-
from pandas import notna, Index, DatetimeIndex, datetime, date_range
9+
from pandas import notna, Index, DatetimeIndex, date_range, Timestamp
10+
from pandas.tseries.offsets import CDay, BDay
11+
12+
START, END = datetime(2009, 1, 1), datetime(2010, 1, 1)
913

1014

1115
class TestDatetimeIndex(object):
@@ -239,3 +243,234 @@ def test_delete_slice(self):
239243
assert result.name == expected.name
240244
assert result.freq == expected.freq
241245
assert result.tz == expected.tz
246+
247+
def test_getitem(self):
248+
idx1 = pd.date_range('2011-01-01', '2011-01-31', freq='D', name='idx')
249+
idx2 = pd.date_range('2011-01-01', '2011-01-31', freq='D',
250+
tz='Asia/Tokyo', name='idx')
251+
252+
for idx in [idx1, idx2]:
253+
result = idx[0]
254+
assert result == Timestamp('2011-01-01', tz=idx.tz)
255+
256+
result = idx[0:5]
257+
expected = pd.date_range('2011-01-01', '2011-01-05', freq='D',
258+
tz=idx.tz, name='idx')
259+
tm.assert_index_equal(result, expected)
260+
assert result.freq == expected.freq
261+
262+
result = idx[0:10:2]
263+
expected = pd.date_range('2011-01-01', '2011-01-09', freq='2D',
264+
tz=idx.tz, name='idx')
265+
tm.assert_index_equal(result, expected)
266+
assert result.freq == expected.freq
267+
268+
result = idx[-20:-5:3]
269+
expected = pd.date_range('2011-01-12', '2011-01-24', freq='3D',
270+
tz=idx.tz, name='idx')
271+
tm.assert_index_equal(result, expected)
272+
assert result.freq == expected.freq
273+
274+
result = idx[4::-1]
275+
expected = DatetimeIndex(['2011-01-05', '2011-01-04', '2011-01-03',
276+
'2011-01-02', '2011-01-01'],
277+
freq='-1D', tz=idx.tz, name='idx')
278+
tm.assert_index_equal(result, expected)
279+
assert result.freq == expected.freq
280+
281+
def test_take(self):
282+
# GH 10295
283+
idx1 = pd.date_range('2011-01-01', '2011-01-31', freq='D', name='idx')
284+
idx2 = pd.date_range('2011-01-01', '2011-01-31', freq='D',
285+
tz='Asia/Tokyo', name='idx')
286+
287+
for idx in [idx1, idx2]:
288+
result = idx.take([0])
289+
assert result == Timestamp('2011-01-01', tz=idx.tz)
290+
291+
result = idx.take([0, 1, 2])
292+
expected = pd.date_range('2011-01-01', '2011-01-03', freq='D',
293+
tz=idx.tz, name='idx')
294+
tm.assert_index_equal(result, expected)
295+
assert result.freq == expected.freq
296+
297+
result = idx.take([0, 2, 4])
298+
expected = pd.date_range('2011-01-01', '2011-01-05', freq='2D',
299+
tz=idx.tz, name='idx')
300+
tm.assert_index_equal(result, expected)
301+
assert result.freq == expected.freq
302+
303+
result = idx.take([7, 4, 1])
304+
expected = pd.date_range('2011-01-08', '2011-01-02', freq='-3D',
305+
tz=idx.tz, name='idx')
306+
tm.assert_index_equal(result, expected)
307+
assert result.freq == expected.freq
308+
309+
result = idx.take([3, 2, 5])
310+
expected = DatetimeIndex(['2011-01-04', '2011-01-03',
311+
'2011-01-06'],
312+
freq=None, tz=idx.tz, name='idx')
313+
tm.assert_index_equal(result, expected)
314+
assert result.freq is None
315+
316+
result = idx.take([-3, 2, 5])
317+
expected = DatetimeIndex(['2011-01-29', '2011-01-03',
318+
'2011-01-06'],
319+
freq=None, tz=idx.tz, name='idx')
320+
tm.assert_index_equal(result, expected)
321+
assert result.freq is None
322+
323+
def test_take_invalid_kwargs(self):
324+
idx = pd.date_range('2011-01-01', '2011-01-31', freq='D', name='idx')
325+
indices = [1, 6, 5, 9, 10, 13, 15, 3]
326+
327+
msg = r"take\(\) got an unexpected keyword argument 'foo'"
328+
tm.assert_raises_regex(TypeError, msg, idx.take,
329+
indices, foo=2)
330+
331+
msg = "the 'out' parameter is not supported"
332+
tm.assert_raises_regex(ValueError, msg, idx.take,
333+
indices, out=indices)
334+
335+
msg = "the 'mode' parameter is not supported"
336+
tm.assert_raises_regex(ValueError, msg, idx.take,
337+
indices, mode='clip')
338+
339+
# TODO: This method came from test_datetime; de-dup with version above
340+
def test_take2(self):
341+
dates = [datetime(2010, 1, 1, 14), datetime(2010, 1, 1, 15),
342+
datetime(2010, 1, 1, 17), datetime(2010, 1, 1, 21)]
343+
344+
for tz in [None, 'US/Eastern', 'Asia/Tokyo']:
345+
idx = DatetimeIndex(start='2010-01-01 09:00',
346+
end='2010-02-01 09:00', freq='H', tz=tz,
347+
name='idx')
348+
expected = DatetimeIndex(dates, freq=None, name='idx', tz=tz)
349+
350+
taken1 = idx.take([5, 6, 8, 12])
351+
taken2 = idx[[5, 6, 8, 12]]
352+
353+
for taken in [taken1, taken2]:
354+
tm.assert_index_equal(taken, expected)
355+
assert isinstance(taken, DatetimeIndex)
356+
assert taken.freq is None
357+
assert taken.tz == expected.tz
358+
assert taken.name == expected.name
359+
360+
def test_take_fill_value(self):
361+
# GH 12631
362+
idx = pd.DatetimeIndex(['2011-01-01', '2011-02-01', '2011-03-01'],
363+
name='xxx')
364+
result = idx.take(np.array([1, 0, -1]))
365+
expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', '2011-03-01'],
366+
name='xxx')
367+
tm.assert_index_equal(result, expected)
368+
369+
# fill_value
370+
result = idx.take(np.array([1, 0, -1]), fill_value=True)
371+
expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', 'NaT'],
372+
name='xxx')
373+
tm.assert_index_equal(result, expected)
374+
375+
# allow_fill=False
376+
result = idx.take(np.array([1, 0, -1]), allow_fill=False,
377+
fill_value=True)
378+
expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', '2011-03-01'],
379+
name='xxx')
380+
tm.assert_index_equal(result, expected)
381+
382+
msg = ('When allow_fill=True and fill_value is not None, '
383+
'all indices must be >= -1')
384+
with tm.assert_raises_regex(ValueError, msg):
385+
idx.take(np.array([1, 0, -2]), fill_value=True)
386+
with tm.assert_raises_regex(ValueError, msg):
387+
idx.take(np.array([1, 0, -5]), fill_value=True)
388+
389+
with pytest.raises(IndexError):
390+
idx.take(np.array([1, -5]))
391+
392+
def test_take_fill_value_with_timezone(self):
393+
idx = pd.DatetimeIndex(['2011-01-01', '2011-02-01', '2011-03-01'],
394+
name='xxx', tz='US/Eastern')
395+
result = idx.take(np.array([1, 0, -1]))
396+
expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', '2011-03-01'],
397+
name='xxx', tz='US/Eastern')
398+
tm.assert_index_equal(result, expected)
399+
400+
# fill_value
401+
result = idx.take(np.array([1, 0, -1]), fill_value=True)
402+
expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', 'NaT'],
403+
name='xxx', tz='US/Eastern')
404+
tm.assert_index_equal(result, expected)
405+
406+
# allow_fill=False
407+
result = idx.take(np.array([1, 0, -1]), allow_fill=False,
408+
fill_value=True)
409+
expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', '2011-03-01'],
410+
name='xxx', tz='US/Eastern')
411+
tm.assert_index_equal(result, expected)
412+
413+
msg = ('When allow_fill=True and fill_value is not None, '
414+
'all indices must be >= -1')
415+
with tm.assert_raises_regex(ValueError, msg):
416+
idx.take(np.array([1, 0, -2]), fill_value=True)
417+
with tm.assert_raises_regex(ValueError, msg):
418+
idx.take(np.array([1, 0, -5]), fill_value=True)
419+
420+
with pytest.raises(IndexError):
421+
idx.take(np.array([1, -5]))
422+
423+
424+
class TestBusinessDatetimeIndexIndexing(object):
425+
def setup_method(self, method):
426+
self.rng = pd.bdate_range(START, END)
427+
428+
def test_getitem(self):
429+
smaller = self.rng[:5]
430+
exp = DatetimeIndex(self.rng.view(np.ndarray)[:5])
431+
tm.assert_index_equal(smaller, exp)
432+
433+
assert smaller.offset == self.rng.offset
434+
435+
sliced = self.rng[::5]
436+
assert sliced.offset == BDay() * 5
437+
438+
fancy_indexed = self.rng[[4, 3, 2, 1, 0]]
439+
assert len(fancy_indexed) == 5
440+
assert isinstance(fancy_indexed, DatetimeIndex)
441+
assert fancy_indexed.freq is None
442+
443+
# 32-bit vs. 64-bit platforms
444+
assert self.rng[4] == self.rng[np.int_(4)]
445+
446+
def test_getitem_matplotlib_hackaround(self):
447+
values = self.rng[:, None]
448+
expected = self.rng.values[:, None]
449+
tm.assert_numpy_array_equal(values, expected)
450+
451+
452+
class TestCustomDatetimeIndexIndexing(object):
453+
def setup_method(self, method):
454+
self.rng = pd.bdate_range(START, END, freq='C')
455+
456+
def test_getitem(self):
457+
smaller = self.rng[:5]
458+
exp = DatetimeIndex(self.rng.view(np.ndarray)[:5])
459+
tm.assert_index_equal(smaller, exp)
460+
assert smaller.offset == self.rng.offset
461+
462+
sliced = self.rng[::5]
463+
assert sliced.offset == CDay() * 5
464+
465+
fancy_indexed = self.rng[[4, 3, 2, 1, 0]]
466+
assert len(fancy_indexed) == 5
467+
assert isinstance(fancy_indexed, DatetimeIndex)
468+
assert fancy_indexed.freq is None
469+
470+
# 32-bit vs. 64-bit platforms
471+
assert self.rng[4] == self.rng[np.int_(4)]
472+
473+
def test_getitem_matplotlib_hackaround(self):
474+
values = self.rng[:, None]
475+
expected = self.rng.values[:, None]
476+
tm.assert_numpy_array_equal(values, expected)

0 commit comments

Comments
 (0)