Skip to content

Commit f427bb4

Browse files
BUG: DatetimeIndex slicing with boolean Index raises TypeError
1 parent 7343fd3 commit f427bb4

File tree

8 files changed

+85
-3
lines changed

8 files changed

+85
-3
lines changed

doc/source/whatsnew/v0.24.0.txt

+2
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,8 @@ Indexing
738738
- Bug in :meth:`DataFrame.loc` when indexing with an :class:`IntervalIndex` (:issue:`19977`)
739739
- :class:`Index` no longer mangles ``None``, ``NaN`` and ``NaT``, i.e. they are treated as three different keys. However, for numeric Index all three are still coerced to a ``NaN`` (:issue:`22332`)
740740
- Bug in `scalar in Index` if scalar is a float while the ``Index`` is of integer dtype (:issue:`22085`)
741+
- Bug in :class:`Index` slicing with boolean `Index` may raise ```TypeError`` (:issue:`22533`)
742+
741743

742744
Missing
743745
^^^^^^^

pandas/core/arrays/datetimelike.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ def __getitem__(self, key):
171171
return self._box_func(val)
172172

173173
if com.is_bool_indexer(key):
174-
key = np.asarray(key)
174+
key = np.asarray(key, dtype=bool)
175175
if key.all():
176176
key = slice(0, None, None)
177177
else:

pandas/core/indexes/base.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2070,7 +2070,7 @@ def __getitem__(self, key):
20702070
return promote(getitem(key))
20712071

20722072
if com.is_bool_indexer(key):
2073-
key = np.asarray(key)
2073+
key = np.asarray(key, dtype=bool)
20742074

20752075
key = com.values_from_object(key)
20762076
result = getitem(key)

pandas/core/indexes/multi.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1607,7 +1607,7 @@ def __getitem__(self, key):
16071607
return tuple(retval)
16081608
else:
16091609
if com.is_bool_indexer(key):
1610-
key = np.asarray(key)
1610+
key = np.asarray(key, dtype=bool)
16111611
sortorder = self.sortorder
16121612
else:
16131613
# cannot be sure whether the result will be sorted

pandas/tests/indexes/datetimes/test_indexing.py

+19
Original file line numberDiff line numberDiff line change
@@ -600,3 +600,22 @@ def test_get_loc_nat(self):
600600
# GH#20464
601601
index = DatetimeIndex(['1/3/2000', 'NaT'])
602602
assert index.get_loc(pd.NaT) == 1
603+
604+
def test_getitem_bool_index(self):
605+
# GH#22533
606+
idx1 = pd.date_range('2011-01-01', '2011-01-05', freq='D', name='idx')
607+
tm.assert_index_equal(idx1[[True] * 5], idx1)
608+
tm.assert_index_equal(idx1[pd.Index([True] * 5)], idx1)
609+
610+
expected = pd.DatetimeIndex(['2011-01-01', '2011-01-03'], name='idx')
611+
tm.assert_index_equal(idx1[[True, False, True, False, False]], expected)
612+
tm.assert_index_equal(idx1[pd.Index([True, False, True, False, False])],
613+
expected)
614+
615+
idx2 = pd.DatetimeIndex(['2011-01-01'], name='idx')
616+
tm.assert_index_equal(idx2[[True]], idx2)
617+
tm.assert_index_equal(idx2[pd.Index([True])], idx2)
618+
619+
expected = pd.DatetimeIndex([], name='idx')
620+
tm.assert_index_equal(idx2[[False]], expected)
621+
tm.assert_index_equal(idx2[pd.Index([False])], expected)

pandas/tests/indexes/multi/test_indexing.py

+23
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,29 @@ def test_get_indexer_consistency(idx):
224224
assert indexer.dtype == np.intp
225225

226226

227+
def test_getitem_bool_index():
228+
# GH#22533
229+
idx1 = MultiIndex.from_tuples([(10, 1), (20, 2), (30, 3),
230+
(40, 4), (50, 5)])
231+
tm.assert_index_equal(idx1[[True] * 5], idx1)
232+
tm.assert_index_equal(idx1[pd.Index([True] * 5)], idx1)
233+
234+
expected = MultiIndex.from_tuples([(10, 1), (30, 3)])
235+
tm.assert_index_equal(idx1[[True, False, True, False, False]], expected)
236+
tm.assert_index_equal(idx1[pd.Index([True, False, True, False, False])],
237+
expected)
238+
239+
idx2 = MultiIndex.from_tuples([(10, 1)])
240+
tm.assert_index_equal(idx2[[True]], idx2)
241+
tm.assert_index_equal(idx2[pd.Index([True])], idx2)
242+
243+
expected = pd.MultiIndex(levels=[np.array([], dtype=np.int64),
244+
np.array([], dtype=np.int64)],
245+
labels=[[], []])
246+
tm.assert_index_equal(idx2[[False]], expected)
247+
tm.assert_index_equal(idx2[pd.Index([False])], expected)
248+
249+
227250
def test_get_loc(idx):
228251
assert idx.get_loc(('foo', 'two')) == 1
229252
assert idx.get_loc(('baz', 'two')) == 3

pandas/tests/indexes/test_base.py

+19
Original file line numberDiff line numberDiff line change
@@ -721,6 +721,25 @@ def test_getitem_error(self, indices, itm):
721721
with pytest.raises(IndexError):
722722
indices[itm]
723723

724+
def test_getitem_bool_index(self):
725+
# GH#22533
726+
idx1 = pd.Index(['a', 'b', 'c', 'd', 'e'], name='idx')
727+
tm.assert_index_equal(idx1[[True] * 5], idx1)
728+
tm.assert_index_equal(idx1[pd.Index([True] * 5)], idx1)
729+
730+
expected = pd.Index(['a', 'c'], name='idx')
731+
tm.assert_index_equal(idx1[[True, False, True, False, False]], expected)
732+
tm.assert_index_equal(idx1[pd.Index([True, False, True, False, False])],
733+
expected)
734+
735+
idx2 = pd.Index(['a'], name='idx')
736+
tm.assert_index_equal(idx2[[True]], idx2)
737+
tm.assert_index_equal(idx2[pd.Index([True])], idx2)
738+
739+
expected = pd.Index([], name='idx')
740+
tm.assert_index_equal(idx2[[False]], expected)
741+
tm.assert_index_equal(idx2[pd.Index([False])], expected)
742+
724743
def test_intersection(self):
725744
first = self.strIndex[:20]
726745
second = self.strIndex[:10]

pandas/tests/indexes/test_numeric.py

+19
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,25 @@ def test_join_outer(self):
843843
tm.assert_numpy_array_equal(lidx, elidx)
844844
tm.assert_numpy_array_equal(ridx, eridx)
845845

846+
def test_getitem_bool_index(self):
847+
# GH#22533
848+
idx1 = pd.Int64Index([1, 2, 3, 4, 5], name='idx')
849+
tm.assert_index_equal(idx1[[True] * 5], idx1)
850+
tm.assert_index_equal(idx1[pd.Index([True] * 5)], idx1)
851+
852+
expected = pd.Int64Index([1, 3], name='idx')
853+
tm.assert_index_equal(idx1[[True, False, True, False, False]], expected)
854+
tm.assert_index_equal(idx1[pd.Index([True, False, True, False, False])],
855+
expected)
856+
857+
idx2 = pd.Int64Index([1], name='idx')
858+
tm.assert_index_equal(idx2[[True]], idx2)
859+
tm.assert_index_equal(idx2[pd.Index([True])], idx2)
860+
861+
expected = pd.Int64Index([], name='idx')
862+
tm.assert_index_equal(idx2[[False]], expected)
863+
tm.assert_index_equal(idx2[pd.Index([False])], expected)
864+
846865

847866
class TestUInt64Index(NumericInt):
848867

0 commit comments

Comments
 (0)