使用dateutil parser解析不完整日期时如何识别缺失的字段?
非结构化日期字段完整性识别及区间生成解决方案
核心实现思路
利用dateutil.parser的默认值填充逻辑,通过两次不同基准的解析结果对比,自动识别用户输入中缺失的字段,无需单独适配各类日期格式:
- 准备两个年、月、日均完全不同的基准默认日期,避免和输入日期的字段值重合导致判断错误
- 调用两次
dateutil.parser.parse,分别传入两个不同的默认日期,得到两个解析结果 - 逐字段(年、月、日)对比两次解析结果:若两次结果的对应字段值不同,说明该字段是用户输入中明确携带的;若相同,说明该字段是默认填充的,属于缺失字段
提示:选择两个差异足够大的默认日期可以避免极端场景下的判断误差,比如刚好输入的月/日和其中一个默认值相同的情况,实际使用时可根据业务场景调整默认日期的取值。
代码实现示例
from dateutil import parser as dparser import datetime from dateutil.relativedelta import relativedelta def get_date_field_info(input_date_str): # 定义两个年月日完全不同的默认日期,避免和输入值冲突 default1 = datetime.datetime(2000, 2, 2) default2 = datetime.datetime(1999, 11, 11) try: res1 = dparser.parse(input_date_str, default=default1) res2 = dparser.parse(input_date_str, default=default2) except: raise ValueError("无效的日期输入格式") # 逐字段判断是否为用户输入的真实值 year = res1.year if res1.year != res2.year else False month = res1.month if res1.month != res2.month else False day = res1.day if res1.day != res2.day else False return (year, month, day) # 基于字段信息生成时间区间 def gen_date_range(input_date_str): year, month, day = get_date_field_info(input_date_str) if day: start = datetime.datetime(year, month, day, 0, 0, 0) end = start + relativedelta(days=1, seconds=-1) elif month: start = datetime.datetime(year, month, 1, 0, 0, 0) end = start + relativedelta(months=1, seconds=-1) else: start = datetime.datetime(year, 1, 1, 0, 0, 0) end = start + relativedelta(years=1, seconds=-1) return (start, end)
效果测试
# 仅输入年份 print(get_date_field_info("2021")) # 输出: (2021, False, False) print(gen_date_range("2021")) # 输出: (datetime.datetime(2021,1,1,0,0), datetime.datetime(2021,12,31,23,59,59)) # 输入年月 print(get_date_field_info("2021 jan")) # 输出: (2021, 1, False) print(gen_date_range("January 2021")) # 输出: (datetime.datetime(2021,1,1,0,0), datetime.datetime(2021,1,31,23,59,59)) # 输入完整日期 print(get_date_field_info("January 15, 2021")) # 输出: (2021, 1, 15) print(gen_date_range("2021/01/01")) # 输出: (datetime.datetime(2021,1,1,0,0), datetime.datetime(2021,1,1,23,59,59))
内容的提问来源于stack exchange,提问作者Gihan Gamage
相关产品推荐
相关产品推荐

