Skip to content

PERF: datetime parsing with Q #50828

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 18, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions pandas/_libs/tslibs/parsing.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -472,16 +472,15 @@ cpdef bint _does_string_look_like_datetime(str py_string):
return True


cdef object _parse_dateabbr_string(object date_string, datetime default,
cdef object _parse_dateabbr_string(str date_string, datetime default,
str freq=None):
# special handling for possibilities eg, 2Q2005, 2Q05, 2005Q1, 05Q1
cdef:
datetime ret
# year initialized to prevent compiler warnings
int year = -1, quarter = -1, month
Py_ssize_t date_len

# special handling for possibilities eg, 2Q2005, 2Q05, 2005Q1, 05Q1
assert isinstance(date_string, str)
const char* buf

if date_string in nat_strings:
return NaT, ""
Expand All @@ -498,10 +497,11 @@ cdef object _parse_dateabbr_string(object date_string, datetime default,
pass

if 4 <= date_len <= 7:
buf = get_c_string_buf_and_size(date_string, &date_len)
try:
i = date_string.index("Q", 1, 6)
if i == 1:
quarter = int(date_string[0])
quarter = _parse_1digit(buf) # i.e. int(date_string[0])
if date_len == 4 or (date_len == 5
and date_string[i + 1] == "-"):
# r'(\d)Q-?(\d\d)')
Expand All @@ -516,15 +516,17 @@ cdef object _parse_dateabbr_string(object date_string, datetime default,
# r'(\d\d)-?Q(\d)'
if date_len == 4 or (date_len == 5
and date_string[i - 1] == "-"):
quarter = int(date_string[-1])
# i.e. quarter = int(date_string[-1])
quarter = _parse_1digit(buf + date_len - 1)
year = 2000 + int(date_string[:2])
else:
raise ValueError
elif i == 4 or i == 5:
if date_len == 6 or (date_len == 7
and date_string[i - 1] == "-"):
# r'(\d\d\d\d)-?Q(\d)'
quarter = int(date_string[-1])
# i.e. quarter = int(date_string[-1])
quarter = _parse_1digit(buf + date_len - 1)
year = int(date_string[:4])
else:
raise ValueError
Expand Down