Skip to content

Commit b2e772f

Browse files
authored
PERF: datetime parsing with Q (#50828)
1 parent 601f227 commit b2e772f

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

pandas/_libs/tslibs/parsing.pyx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -472,16 +472,15 @@ cpdef bint _does_string_look_like_datetime(str py_string):
472472
return True
473473

474474

475-
cdef object _parse_dateabbr_string(object date_string, datetime default,
475+
cdef object _parse_dateabbr_string(str date_string, datetime default,
476476
str freq=None):
477+
# special handling for possibilities eg, 2Q2005, 2Q05, 2005Q1, 05Q1
477478
cdef:
478479
datetime ret
479480
# year initialized to prevent compiler warnings
480481
int year = -1, quarter = -1, month
481482
Py_ssize_t date_len
482-
483-
# special handling for possibilities eg, 2Q2005, 2Q05, 2005Q1, 05Q1
484-
assert isinstance(date_string, str)
483+
const char* buf
485484

486485
if date_string in nat_strings:
487486
return NaT, ""
@@ -498,10 +497,11 @@ cdef object _parse_dateabbr_string(object date_string, datetime default,
498497
pass
499498

500499
if 4 <= date_len <= 7:
500+
buf = get_c_string_buf_and_size(date_string, &date_len)
501501
try:
502502
i = date_string.index("Q", 1, 6)
503503
if i == 1:
504-
quarter = int(date_string[0])
504+
quarter = _parse_1digit(buf) # i.e. int(date_string[0])
505505
if date_len == 4 or (date_len == 5
506506
and date_string[i + 1] == "-"):
507507
# r'(\d)Q-?(\d\d)')
@@ -516,15 +516,17 @@ cdef object _parse_dateabbr_string(object date_string, datetime default,
516516
# r'(\d\d)-?Q(\d)'
517517
if date_len == 4 or (date_len == 5
518518
and date_string[i - 1] == "-"):
519-
quarter = int(date_string[-1])
519+
# i.e. quarter = int(date_string[-1])
520+
quarter = _parse_1digit(buf + date_len - 1)
520521
year = 2000 + int(date_string[:2])
521522
else:
522523
raise ValueError
523524
elif i == 4 or i == 5:
524525
if date_len == 6 or (date_len == 7
525526
and date_string[i - 1] == "-"):
526527
# r'(\d\d\d\d)-?Q(\d)'
527-
quarter = int(date_string[-1])
528+
# i.e. quarter = int(date_string[-1])
529+
quarter = _parse_1digit(buf + date_len - 1)
528530
year = int(date_string[:4])
529531
else:
530532
raise ValueError

0 commit comments

Comments
 (0)