如何为字符串中的日期补零使月份为2位 解决dateutil解析报错
问题说明
现有两种带冗余后缀的日期字符串:
- 2位月份格式:
bd1 = '05/27/2018 SW1604-3' - 1位月份无补零格式:
bd2 = '9/16/2021 SU1'
使用dateutil.parser的模糊解析模式提取日期时,2位月份的字符串可以正常解析,执行代码与返回结果如下:
>>> import dateutil.parser as dparser >>> str(dparser.parse(bd1,fuzzy=True)).split(" ")[0] '2018-05-27'
但解析1位月份的字符串时会抛出ParserError,报错信息如下:
>>> import dateutil.parser as dparser >>> str(dparser.parse(bd2,fuzzy=True)).split(" ")[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\Noah Siegel\.conda\envs\webvitals\lib\site-packages\dateutil\parser\_parser.py", line 1368, in parse return DEFAULTPARSER.parse(timestr, **kwargs) File "C:\Users\Noah Siegel\.conda\envs\webvitals\lib\site-packages\dateutil\parser\_parser.py", line 643, in parse raise ParserError("Unknown string format: %s", timestr) dateutil.parser._parser.ParserError: Unknown string format: 9/16/2021 SU1
需要实现兼容两种格式的解析逻辑,保障日期正常提取。
解决方法
触发报错的核心原因是模糊解析模式下,字符串尾部的冗余字符会被误识别为日期组件,和非补零的月/日格式产生冲突,不需要手动给单数字月份补前导零,优先用正则先提取出字符串中符合M/D/YYYY规则的日期段,再交给解析器处理即可兼容1位、2位的月/日格式,代码如下:
import re import dateutil.parser as dparser def extract_date(s): # 正则提取斜杠分隔的日期段,兼容月、日为1-2位数字的场景 date_segment = re.search(r'(\d{1,2}/\d{1,2}/\d{4})', s).group(1) return str(dparser.parse(date_segment)).split(" ")[0] # 测试两种格式样本 bd1 = '05/27/2018 SW1604-3' bd2 = '9/16/2021 SU1' print(extract_date(bd1)) # 输出:2018-05-27 print(extract_date(bd2)) # 输出:2021-09-16
如果业务要求必须先把所有日期的月、日统一补前导零为2位格式,可以通过正则回调替换实现,处理后再走原有解析逻辑即可:
import re def pad_date_zero(s): def _pad(match_res): month, day, year = match_res.groups() return f"{month.zfill(2)}/{day.zfill(2)}/{year}" # 匹配所有符合M/D/YYYY规则的日期段,对月、日补前导零 return re.sub(r'(\d{1,2})/(\d{1,2})/(\d{4})', _pad, s) # 测试 print(pad_date_zero(bd2)) # 输出:09/16/2021 SU1
内容的提问来源于stack exchange,提问作者Noah_Seagull
相关产品推荐
相关产品推荐

