如何指定parser.parse()的允许日期格式及顺序,并实现完整日期校验?
解决dateutil.parser.parse的自定义日期解析需求
1. 优先按「日/月/年」格式解析
直接使用parser.parse()的dayfirst=True参数,就能让解析器优先将日期字符串中的第一个数字视为日,第二个视为月份,完美解决10/11/2022解析为11月的需求:
from dateutil import parser date1 = '2022/11/10' date2 = '10/11/2022' # 优先日/月/年解析 parsed_date1 = parser.parse(date1, dayfirst=True) parsed_date2 = parser.parse(date2, dayfirst=True) print(parsed_date1) # 输出: 2022-11-10 00:00:00 print(parsed_date2) # 输出: 2022-11-10 00:00:00
2. 强制仅解析包含日、月、年的完整日期
parser.parse()默认会自动补全缺失的日期部分(比如单个数字"20"会补全为当前年月的20日),要避免这种行为,你可以先用预编译的正则表达式快速校验输入格式,再调用解析函数——正则匹配的性能远优于手写大量if判断,完全适合大数据场景。
示例代码:
import re from dateutil import parser # 预编译正则表达式,匹配常见的完整日期格式(支持/、-分隔符) full_date_pattern = re.compile( r'^\d{1,2}[/-]\d{1,2}[/-]\d{4}$|^\d{4}[/-]\d{1,2}[/-]\d{1,2}$' ) def parse_full_date(date_str): # 校验是否为完整日期格式 if not full_date_pattern.match(date_str): raise ValueError("输入必须是包含日、月、年的完整日期") # 按优先日/月/年规则解析 return parser.parse(date_str, dayfirst=True) # 测试用例 # 合法输入 print(parse_full_date('10/11/2022')) # 2022-11-10 00:00:00 print(parse_full_date('2022-11-10')) # 2022-11-10 00:00:00 # 非法输入(仅单个数字) try: parse_full_date("20") except ValueError as e: print(e) # 输出: 输入必须是包含日、月、年的完整日期
性能说明
- 预编译的正则表达式在多次调用时性能极高,不会成为大数据处理的瓶颈;
dateutil.parser.parse()本身是经过优化的底层实现,比手写的自定义解析函数性能更可靠。
如果需要支持更多分隔符(比如.),只需修改正则中的分隔符部分为[/-.]即可。
内容的提问来源于stack exchange,提问作者Merger
相关产品推荐
相关产品推荐

