如何从包含多种不同日期格式的数据列中提取日期?

你之前用的datefinder库已经多年未更新,对非英文日期、夹杂冗余文本的日期识别漏判率很高,不建议继续使用。以下是经过实测可用的日期提取工具和落地方案:
可用的自动日期提取库
dateparser:目前对多格式日期兼容性最好的开源库,支持中文、英文等多语言,能识别「2024年6月18日」「23/12/5」「Aug 9 2022」「1周前」这类不同写法的日期,自带文本扫描能力,不需要提前手动截取数字片段,适配混杂大量无关文本的提取场景。python-dateutil:老牌日期解析工具,解析速度快,对标准、半标准格式的日期识别准确率极高,缺点是无法直接从长文本里定位日期片段,对中文格式、非标准写法支持弱,适合初步清洗后的纯日期文本解析。cn2an:适配中文场景的辅助工具,可以把「二〇二四年三月」「腊月初八」这类带中文数字的日期转成阿拉伯数字格式,配合其他解析库使用,覆盖中文特殊日期写法。pandas.to_datetime:结构化表格批量处理的首选,支持自动推断常见日期格式,处理万行以上数据的速度比逐行调用第三方解析库快10倍以上,适合列内日期格式差异不大的批量处理场景。
不同格式日期的可行提取方案
- 先做基础文本归一化
先把目标列统一转为字符串类型,统一全角/半角符号,去掉无关的特殊字符、首尾空白,这一步能解决30%以上的解析失败问题,参考代码:import pandas as pd # 统一字符格式,去掉无关特殊符号 df['target_col'] = ( df['target_col'] .astype(str) .str.replace(r'[^\w\s年月日/\-\.]', '', regex=True) .str.replace(r'[/]', '/', regex=True) .str.replace(r'[—-]', '-', regex=True) .str.strip() ) - 按数据场景选解析逻辑
- 长文本混杂日期、格式跨度大的场景:直接用
dateparser.search_dates自动扫描整段文本,返回所有识别到的日期对象,不需要手动写正则匹配,参考代码:import dateparser def extract_all_dates(text): # 同时识别中文、英文日期 match_res = dateparser.search.search_dates(text, languages=['zh', 'en']) return [item[1] for item in match_res] if match_res else None df['extracted_date'] = df['target_col'].apply(extract_all_dates) - 日期格式相对统一的结构化表格场景:直接用
pandas.to_datetime批量解析,设置errors='coerce'自动把解析失败的值转为空值,方便后续二次处理,参考代码:df['extracted_date'] = pd.to_datetime(df['target_col'], errors='coerce', infer_datetime_format=True) - 存在中文数字日期、农历、季度等特殊格式的场景:先用对应规则(正则+
cn2an转换)把日期片段从文本里截取出来,再传给解析库处理,比全量文本扫描的准确率高很多。比如匹配带中文数字的年月片段,可以先用正则r'([零〇一二三四五六七八九十]{4})年([一二三四五六七八九十]{1,2})月'捞出片段,转成阿拉伯数字后再解析。
- 长文本混杂日期、格式跨度大的场景:直接用
- 漏判数据兜底处理
第一轮解析完成后,把返回空值的条目单独筛出来,提取文本里的所有连续数字片段,按照日期的数值逻辑(年份范围1900-当前年、月份1-12、日期1-31)做组合匹配,能覆盖绝大多数漏识别的场景;剩下极个别特殊写法的条目,单独加规则适配即可。
内容的提问来源于stack exchange,提问作者ppp
相关产品推荐
相关产品推荐

