Skip to content

Commit a8c84fa

Browse files
committed
BUG: Return KeyError for invalid string key
closes: pandas-dev#22803
1 parent 528527b commit a8c84fa

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

pandas/core/indexes/period.py

Lines changed: 8 additions & 2 deletions
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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,9 @@ def test_get_loc(self):
363363
assert idx0.get_loc(p2) == expected_idx1_p2
364364
assert idx0.get_loc(str(p2)) == expected_idx1_p2
365365

366-
pytest.raises(tslibs.parsing.DateParseError, idx0.get_loc, 'foo')
366+
tm.assert_raises_regex(KeyError,
367+
"Cannot interpret 'foo' as period",
368+
idx0.get_loc, 'foo')
367369
pytest.raises(KeyError, idx0.get_loc, 1.1)
368370
pytest.raises(TypeError, idx0.get_loc, idx0)
369371

@@ -378,7 +380,9 @@ def test_get_loc(self):
378380
assert idx1.get_loc(p2) == expected_idx1_p2
379381
assert idx1.get_loc(str(p2)) == expected_idx1_p2
380382

381-
pytest.raises(tslibs.parsing.DateParseError, idx1.get_loc, 'foo')
383+
tm.assert_raises_regex(KeyError,
384+
"Cannot interpret 'foo' as period",
385+
idx1.get_loc, 'foo')
382386
pytest.raises(KeyError, idx1.get_loc, 1.1)
383387
pytest.raises(TypeError, idx1.get_loc, idx1)
384388

0 commit comments

Comments
 (0)