如何用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
相关产品推荐
相关产品推荐

