Skip to content

Commit 9a12c7e

Browse files
committed
Replace regexp-based checking for string being time with Cython impl
1 parent d41c1da commit 9a12c7e

File tree

1 file changed

+21
-3
lines changed

1 file changed

+21
-3
lines changed

pandas/_libs/tslibs/parsing.pyx

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,6 @@ _DEFAULT_DATETIME = datetime(1, 1, 1).replace(hour=0, minute=0,
4444
second=0, microsecond=0)
4545

4646
cdef:
47-
object _TIMEPAT = re.compile(r'^([01]?[0-9]|2[0-3]):([0-5][0-9])')
48-
4947
set _not_datelike_strings = {'a', 'A', 'm', 'M', 'p', 'P', 't', 'T'}
5048

5149
# ----------------------------------------------------------------------
@@ -144,6 +142,26 @@ cdef inline object _parse_delimited_date(object date_string, bint dayfirst):
144142
raise DateParseError("Invalid date specified ({}/{})".format(month, day))
145143

146144

145+
cdef bint does_string_look_like_time(object parse_string):
146+
cdef:
147+
const char* buf
148+
Py_ssize_t length
149+
int hour = -1, minute = -1
150+
151+
buf = get_c_string_buf_and_size(parse_string, &length)
152+
if length >= 4:
153+
if buf[1] == b':':
154+
# h:MM format
155+
hour = getdigit_ascii(buf[0], -1)
156+
minute = _parse_2digit(buf + 2)
157+
elif buf[2] == b':':
158+
# HH:MM format
159+
hour = _parse_2digit(buf)
160+
minute = _parse_2digit(buf + 3)
161+
162+
return 0 <= hour <= 23 and 0 <= minute <= 59
163+
164+
147165
def parse_datetime_string(date_string, freq=None, dayfirst=False,
148166
yearfirst=False, **kwargs):
149167
"""parse datetime string, only returns datetime.
@@ -160,7 +178,7 @@ def parse_datetime_string(date_string, freq=None, dayfirst=False,
160178
if not _does_string_look_like_datetime(date_string):
161179
raise ValueError('Given date string not likely a datetime.')
162180

163-
if _TIMEPAT.match(date_string):
181+
if does_string_look_like_time(date_string):
164182
# use current datetime as default, not pass _DEFAULT_DATETIME
165183
dt = du_parse(date_string, dayfirst=dayfirst,
166184
yearfirst=yearfirst, **kwargs)

0 commit comments

Comments
 (0)