Skip to content

Commit 04893a9

Browse files
jbrockmendeljreback
authored andcommitted
BUG: parse_time_string failing to raise TypeError (#29098)
1 parent 6931051 commit 04893a9

File tree

5 files changed

+12
-11
lines changed

5 files changed

+12
-11
lines changed

pandas/_libs/tslibs/parsing.pyx

+2-2
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ def parse_datetime_string(date_string, freq=None, dayfirst=False,
233233
return dt
234234

235235

236-
def parse_time_string(arg, freq=None, dayfirst=None, yearfirst=None):
236+
def parse_time_string(arg: str, freq=None, dayfirst=None, yearfirst=None):
237237
"""
238238
Try hard to parse datetime string, leveraging dateutil plus some extra
239239
goodies like quarter recognition.
@@ -253,7 +253,7 @@ def parse_time_string(arg, freq=None, dayfirst=None, yearfirst=None):
253253
datetime, datetime/dateutil.parser._result, str
254254
"""
255255
if not isinstance(arg, str):
256-
return arg
256+
raise TypeError("parse_time_string argument must be str")
257257

258258
if getattr(freq, "_typ", None) == "dateoffset":
259259
freq = freq.rule_code

pandas/core/indexes/datetimes.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1106,7 +1106,7 @@ def _maybe_cast_slice_bound(self, label, side, kind):
11061106
else:
11071107
return label
11081108

1109-
def _get_string_slice(self, key, use_lhs=True, use_rhs=True):
1109+
def _get_string_slice(self, key: str, use_lhs: bool = True, use_rhs: bool = True):
11101110
freq = getattr(self, "freqstr", getattr(self, "inferred_freq", None))
11111111
_, parsed, reso = parsing.parse_time_string(key, freq)
11121112
loc = self._partial_date_slice(reso, parsed, use_lhs=use_lhs, use_rhs=use_rhs)

pandas/core/indexes/period.py

+2-7
Original file line numberDiff line numberDiff line change
@@ -457,11 +457,8 @@ def __contains__(self, key):
457457
try:
458458
self.get_loc(key)
459459
return True
460-
except (ValueError, TypeError, KeyError):
460+
except (TypeError, KeyError):
461461
# TypeError can be reached if we pass a tuple that is not hashable
462-
# ValueError can be reached if pass a 2-tuple and parse_time_string
463-
# raises with the wrong number of return values
464-
# TODO: the latter is a bug in parse_time_string
465462
return False
466463

467464
@cache_readonly
@@ -608,7 +605,7 @@ def get_value(self, series, key):
608605
try:
609606
return com.maybe_box(self, super().get_value(s, key), series, key)
610607
except (KeyError, IndexError):
611-
try:
608+
if isinstance(key, str):
612609
asdt, parsed, reso = parse_time_string(key, self.freq)
613610
grp = resolution.Resolution.get_freq_group(reso)
614611
freqn = resolution.get_freq_group(self.freq)
@@ -634,8 +631,6 @@ def get_value(self, series, key):
634631
)
635632
else:
636633
raise KeyError(key)
637-
except TypeError:
638-
pass
639634

640635
period = Period(key, self.freq)
641636
key = period.value if isna(period) else period.ordinal

pandas/core/indexes/timedeltas.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ def get_loc(self, key, method=None, tolerance=None):
528528
# the try/except clauses below
529529
tolerance = self._convert_tolerance(tolerance, np.asarray(key))
530530

531-
if _is_convertible_to_td(key):
531+
if _is_convertible_to_td(key) or key is NaT:
532532
key = Timedelta(key)
533533
return Index.get_loc(self, key, method, tolerance)
534534

pandas/tests/tslibs/test_parsing.py

+6
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ def test_parse_time_string():
2323
assert parsed == parsed_lower
2424

2525

26+
def test_parse_time_string_invalid_type():
27+
# Raise on invalid input, don't just return it
28+
with pytest.raises(TypeError):
29+
parse_time_string((4, 5))
30+
31+
2632
@pytest.mark.parametrize(
2733
"dashed,normal", [("1988-Q2", "1988Q2"), ("2Q-1988", "2Q1988")]
2834
)

0 commit comments

Comments
 (0)