Skip to content

Commit 0b0cd08

Browse files
jbrockmendeljreback
authored andcommitted
BUG: DatetimeIndex.get_loc/get_value raise InvalidIndexError (#31257)
1 parent 38ea154 commit 0b0cd08

File tree

5 files changed

+14
-4
lines changed

5 files changed

+14
-4
lines changed

pandas/core/groupby/grouper.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
from pandas.core.groupby import ops
2828
from pandas.core.groupby.categorical import recode_for_groupby, recode_from_groupby
2929
from pandas.core.indexes.api import CategoricalIndex, Index, MultiIndex
30+
from pandas.core.indexes.base import InvalidIndexError
3031
from pandas.core.series import Series
3132

3233
from pandas.io.formats.printing import pprint_thing
@@ -565,7 +566,7 @@ def is_in_axis(key) -> bool:
565566
items = obj._data.items
566567
try:
567568
items.get_loc(key)
568-
except (KeyError, TypeError):
569+
except (KeyError, TypeError, InvalidIndexError):
569570
# TypeError shows up here if we pass e.g. Int64Index
570571
return False
571572

pandas/core/indexes/datetimes.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
validate_tz_from_dtype,
2828
)
2929
import pandas.core.common as com
30-
from pandas.core.indexes.base import Index, maybe_extract_name
30+
from pandas.core.indexes.base import Index, InvalidIndexError, maybe_extract_name
3131
from pandas.core.indexes.datetimelike import (
3232
DatetimelikeDelegateMixin,
3333
DatetimeTimedeltaMixin,
@@ -641,6 +641,8 @@ def get_value(self, series, key):
641641
Fast lookup of value from 1-dimensional ndarray. Only use this if you
642642
know what you're doing
643643
"""
644+
if not is_scalar(key):
645+
raise InvalidIndexError(key)
644646

645647
if isinstance(key, (datetime, np.datetime64)):
646648
return self.get_value_maybe_box(series, key)
@@ -677,6 +679,9 @@ def get_loc(self, key, method=None, tolerance=None):
677679
-------
678680
loc : int
679681
"""
682+
if not is_scalar(key):
683+
raise InvalidIndexError(key)
684+
680685
if is_valid_nat_for_dtype(key, self.dtype):
681686
key = NaT
682687

pandas/core/indexes/multi.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2778,7 +2778,7 @@ def maybe_mi_droplevels(indexer, levels, drop_level: bool):
27782778
indexer = self._get_level_indexer(key, level=level)
27792779
new_index = maybe_mi_droplevels(indexer, [0], drop_level)
27802780
return indexer, new_index
2781-
except TypeError:
2781+
except (TypeError, InvalidIndexError):
27822782
pass
27832783

27842784
if not any(isinstance(k, slice) for k in key):

pandas/core/series.py

+3
Original file line numberDiff line numberDiff line change
@@ -980,6 +980,9 @@ def __setitem__(self, key, value):
980980
self[:] = value
981981
else:
982982
self.loc[key] = value
983+
except InvalidIndexError:
984+
# e.g. slice
985+
self._set_with(key, value)
983986

984987
except TypeError as e:
985988
if isinstance(key, tuple) and not isinstance(self.index, MultiIndex):

pandas/tests/indexes/datetimes/test_indexing.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import pandas as pd
88
from pandas import DatetimeIndex, Index, Timestamp, date_range, notna
99
import pandas._testing as tm
10+
from pandas.core.indexes.base import InvalidIndexError
1011

1112
from pandas.tseries.offsets import BDay, CDay
1213

@@ -697,7 +698,7 @@ def test_get_loc(self):
697698

698699
with pytest.raises(KeyError, match="'foobar'"):
699700
idx.get_loc("foobar")
700-
with pytest.raises(TypeError):
701+
with pytest.raises(InvalidIndexError, match=r"slice\(None, 2, None\)"):
701702
idx.get_loc(slice(2))
702703

703704
idx = pd.to_datetime(["2000-01-01", "2000-01-04"])

0 commit comments

Comments
 (0)