@@ -44,8 +44,6 @@ _DEFAULT_DATETIME = datetime(1, 1, 1).replace(hour=0, minute=0,
44
44
second = 0 , microsecond = 0 )
45
45
46
46
cdef:
47
- object _TIMEPAT = re.compile(r ' ^ ( [01 ]? [0-9 ]| 2[0-3 ]) :( [0-5 ][0-9 ]) ' )
48
-
49
47
set _not_datelike_strings = {' a' , ' A' , ' m' , ' M' , ' p' , ' P' , ' t' , ' T' }
50
48
51
49
# ----------------------------------------------------------------------
@@ -144,6 +142,26 @@ cdef inline object _parse_delimited_date(object date_string, bint dayfirst):
144
142
raise DateParseError(" Invalid date specified ({}/{})" .format(month, day))
145
143
146
144
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
+
147
165
def parse_datetime_string (date_string , freq = None , dayfirst = False ,
148
166
yearfirst = False , **kwargs ):
149
167
""" parse datetime string, only returns datetime.
@@ -160,7 +178,7 @@ def parse_datetime_string(date_string, freq=None, dayfirst=False,
160
178
if not _does_string_look_like_datetime(date_string):
161
179
raise ValueError (' Given date string not likely a datetime.' )
162
180
163
- if _TIMEPAT.match (date_string):
181
+ if does_string_look_like_time (date_string):
164
182
# use current datetime as default, not pass _DEFAULT_DATETIME
165
183
dt = du_parse(date_string, dayfirst = dayfirst,
166
184
yearfirst = yearfirst, ** kwargs)
0 commit comments