You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 20:15:04