@@ -976,7 +976,6 @@ def guess_datetime_format(dt_str: str, bint dayfirst=False) -> str | None:
976
976
((' hour' ,), ' %H ' , 2 ),
977
977
((' minute' ,), ' %M ' , 2 ),
978
978
((' second' ,), ' %S ' , 2 ),
979
- ((' microsecond' ,), ' %f ' , 6 ),
980
979
((' second' , ' microsecond' ), ' %S .%f ' , 0 ),
981
980
((' tzinfo' ,), ' %z ' , 0 ),
982
981
((' tzinfo' ,), ' %Z ' , 0 ),
@@ -1048,7 +1047,7 @@ def guess_datetime_format(dt_str: str, bint dayfirst=False) -> str | None:
1048
1047
1049
1048
parsed_formatted = parsed_datetime.strftime(attr_format)
1050
1049
for i, token_format in enumerate (format_guess):
1051
- token_filled = tokens[i].zfill( padding)
1050
+ token_filled = _fill_token( tokens[i], padding)
1052
1051
if token_format is None and token_filled == parsed_formatted:
1053
1052
format_guess[i] = attr_format
1054
1053
tokens[i] = token_filled
@@ -1090,6 +1089,19 @@ def guess_datetime_format(dt_str: str, bint dayfirst=False) -> str | None:
1090
1089
else :
1091
1090
return None
1092
1091
1092
+ cdef str _fill_token(token: str , padding: int ):
1093
+ cdef str token_filled
1094
+ if ' .' not in token:
1095
+ token_filled = token.zfill(padding)
1096
+ else :
1097
+ seconds, nanoseconds = token.split(' .' )
1098
+ seconds = f' {int(seconds):02d}'
1099
+ # right-pad so we get nanoseconds, then only take
1100
+ # first 6 digits (microseconds) as stdlib datetime
1101
+ # doesn't support nanoseconds
1102
+ nanoseconds = nanoseconds.ljust(9 , ' 0' )[:6 ]
1103
+ token_filled = f' {seconds}.{nanoseconds}'
1104
+ return token_filled
1093
1105
1094
1106
@ cython.wraparound (False )
1095
1107
@ cython.boundscheck (False )
0 commit comments