Skip to content

Commit e44b249

Browse files
committed
BUG: Return KeyError for invalid string key
closes: #22803
1 parent 528527b commit e44b249

File tree

3 files changed

+15
-5
lines changed

3 files changed

+15
-5
lines changed

doc/source/whatsnew/v0.24.0.txt

+1
Original file line numberDiff line numberDiff line change
@@ -1205,6 +1205,7 @@ Indexing
12051205
^^^^^^^^
12061206

12071207
- The traceback from a ``KeyError`` when asking ``.loc`` for a single missing label is now shorter and more clear (:issue:`21557`)
1208+
- :class:`PeriodIndex` now emits a ``KeyError`` when a malformed string is looked up, which is consistent with the behavior of :class:`DateTimeIndex` (:issue:`22803`)
12081209
- When ``.ix`` is asked for a missing integer label in a :class:`MultiIndex` with a first level of integer type, it now raises a ``KeyError``, consistently with the case of a flat :class:`Int64Index`, rather than falling back to positional indexing (:issue:`21593`)
12091210
- Bug in :meth:`DatetimeIndex.reindex` when reindexing a tz-naive and tz-aware :class:`DatetimeIndex` (:issue:`8306`)
12101211
- Bug in :meth:`Series.reindex` when reindexing an empty series with a ``datetime64[ns, tz]`` dtype (:issue:`20869`)

pandas/core/indexes/period.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from pandas.core.indexes.datetimelike import (
2121
DatelikeOps, DatetimeIndexOpsMixin, wrap_arithmetic_op
2222
)
23-
from pandas.core.tools.datetimes import parse_time_string
23+
from pandas.core.tools.datetimes import parse_time_string, DateParseError
2424

2525
from pandas._libs import tslib, index as libindex
2626
from pandas._libs.tslibs.period import (Period, IncompatibleFrequency,
@@ -580,7 +580,10 @@ def searchsorted(self, value, side='left', sorter=None):
580580
raise IncompatibleFrequency(msg)
581581
value = value.ordinal
582582
elif isinstance(value, compat.string_types):
583-
value = Period(value, freq=self.freq).ordinal
583+
try:
584+
value = Period(value, freq=self.freq).ordinal
585+
except DateParseError:
586+
raise KeyError("Cannot interpret '{}' as period".format(value))
584587

585588
return self._ndarray_values.searchsorted(value, side=side,
586589
sorter=sorter)
@@ -711,6 +714,9 @@ def get_loc(self, key, method=None, tolerance=None):
711714
key = asdt
712715
except TypeError:
713716
pass
717+
except DateParseError:
718+
# A string with invalid format
719+
raise KeyError("Cannot interpret '{}' as period".format(key))
714720

715721
try:
716722
key = Period(key, freq=self.freq)

pandas/tests/indexes/period/test_indexing.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import numpy as np
44
import pytest
55

6-
from pandas._libs import tslibs
76
from pandas._libs.tslibs import period as libperiod
87
from pandas.compat import lrange
98

@@ -363,7 +362,9 @@ def test_get_loc(self):
363362
assert idx0.get_loc(p2) == expected_idx1_p2
364363
assert idx0.get_loc(str(p2)) == expected_idx1_p2
365364

366-
pytest.raises(tslibs.parsing.DateParseError, idx0.get_loc, 'foo')
365+
tm.assert_raises_regex(KeyError,
366+
"Cannot interpret 'foo' as period",
367+
idx0.get_loc, 'foo')
367368
pytest.raises(KeyError, idx0.get_loc, 1.1)
368369
pytest.raises(TypeError, idx0.get_loc, idx0)
369370

@@ -378,7 +379,9 @@ def test_get_loc(self):
378379
assert idx1.get_loc(p2) == expected_idx1_p2
379380
assert idx1.get_loc(str(p2)) == expected_idx1_p2
380381

381-
pytest.raises(tslibs.parsing.DateParseError, idx1.get_loc, 'foo')
382+
tm.assert_raises_regex(KeyError,
383+
"Cannot interpret 'foo' as period",
384+
idx1.get_loc, 'foo')
382385
pytest.raises(KeyError, idx1.get_loc, 1.1)
383386
pytest.raises(TypeError, idx1.get_loc, idx1)
384387

0 commit comments

Comments
 (0)