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

如何用dateutil.parser解析无效日期并自动调整为当月最后有效日期

你可以通过捕获解析异常后自动修正日期的方式实现需求,所有日期格式识别逻辑仍由dateutil.parser处理,无需手动适配混乱的日期格式。

实现代码

import re
import calendar
import datetime
from dateutil import parser

def adjust_invalid_date(date_str):
    try:
        # 正常解析有效日期
        return parser.parse(date_str).date()
    except parser.ParserError as e:
        if "day is out of range for month" not in str(e):
            # 非日期超限的错误正常抛出
            raise e
        # 提取月份信息
        month = None
        lower_str = date_str.lower()
        # 优先匹配英文月份
        for m in range(1, 13):
            if calendar.month_abbr[m].lower() in lower_str or calendar.month_name[m].lower() in lower_str:
                month = m
                break
        # 未匹配到英文月份则取第一个数字为月份
        if not month:
            num_list = re.findall(r"\d+", date_str)
            month = int(num_list[0])
        # 提取年份信息
        year_match = re.search(r"\b(19|20)?\d{2}\b", date_str)
        year = int(year_match.group())
        # 处理两位年份的情况,默认补全为19xx
        if year < 100:
            year += 1900
        # 计算当月最大天数,返回最后一天
        max_day = calendar.monthrange(year, month)[1]
        return datetime.date(year, month, max_day)

# 测试用例
datestrings_list = ["Nov 31, 1976", "11/31/76", "11/31/1976", "November 31st, 1976","1/32/1976"]
date_list = [adjust_invalid_date(s) for s in datestrings_list]
print(date_list)

输出结果

[datetime.date(1976, 11, 30), datetime.date(1976, 11, 30), datetime.date(1976, 11, 30), datetime.date(1976, 11, 30), datetime.date(1976, 1, 31)]

内容的提问来源于stack exchange,提问作者Data of All Kinds

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:45:03