如何在Pandas DataFrame列中提取字符串日期并处理特殊场景?
解决方案
自定义日期提取函数
要同时处理多日期提取和无日期的异常,你需要编写一个自定义函数,替代直接在apply中使用lambda:
from dateutil.parser import parse, ParserError import pandas as pd def extract_all_dates(text, sep=', '): dates = [] remaining_text = str(text).strip() while remaining_text: try: # 解析日期并获取剩余未解析的文本片段 date_obj, tokens = parse(remaining_text, fuzzy_with_tokens=True) dates.append(str(date_obj)) # 若需仅保留日期部分,改用str(date_obj.date()) # 更新剩余文本,继续查找下一个日期 remaining_text = ''.join(tokens).strip() except ParserError: # 无更多可解析日期,终止循环 break # 有日期则用分隔符连接,无日期则返回空值 return sep.join(dates) if dates else pd.NA
应用到DataFrame
将函数直接应用到目标列即可:
df['Dates'] = df['Column to extract'].apply(extract_all_dates)
关键说明
- 多日期处理:通过循环解析剩余文本,每次提取一个日期后,继续在剩下的内容中查找,直到无法解析为止,最后用指定分隔符(默认
,)连接所有日期。 - 异常处理:捕获
ParserError,当字符串中无日期时返回pd.NA(可根据需求改为空字符串""),避免整个apply过程报错中断。 - 原代码问题:你之前的代码直接返回了
parse的元组结果(包含日期对象和剩余文本),且未处理多日期与异常,因此无法得到预期的日期字符串。
示例效果
假设你的DataFrame内容如下:
data = { 'Column to extract': [ 'January 24, 1976 and March 15, 2020', 'No date in this string', 'Deadlines: 2023-10-05 and 11/20/2023' ] } df = pd.DataFrame(data)
运行代码后,df['Dates']的结果为:
| Dates |
|---|
| 1976-01-24 00:00:00, 2020-03-15 00:00:00 |
| 2023-10-05 00:00:00, 2023-11-20 00:00:00 |
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

