如何从DataFrame的字符串列中提取指定格式的日期
提取指定格式日期的解决方案
你之前用str.replace('\D+', '')会把所有非数字字符删掉——不仅会把带斜杠的日期变成无分隔符格式,还会把非日期的长数字(比如最后一行的11位数字)也保留下来,完全不符合提取日期的需求。可以用正则匹配+格式转换的方式精准解决:
步骤1:提取符合格式的日期字符串
用str.extract匹配两种目标日期格式(带斜杠的dd/mm/yyyy或无分隔符的ddmmyyyy),正则表达式可以精准覆盖这两种情况:
import pandas as pd # 示例数据 data = {'description': ['A CAKE 01/02/1989', 'information 22031970', 'some text', 'values 12345678987']} df = pd.DataFrame(data) # 提取日期:只匹配dd/mm/yyyy或ddmmyyyy格式 df['extracted_date'] = df['description'].str.extract(r'(\d{2}/\d{2}/\d{4}|\d{8})')
这一步后,extracted_date列会得到:
| extracted_date |
|---|
| 01/02/1989 |
| 22031970 |
| NaN |
| NaN |
(最后一行的11位数字不符合8位/10位带斜杠的日期格式,会被自动排除)
步骤2:统一日期格式
把无分隔符的ddmmyyyy转换成标准的dd/mm/yyyy格式:
# 自定义函数处理日期格式 def format_date(date_str): if pd.isna(date_str): return date_str # 对8位无分隔符日期插入斜杠 if len(date_str) == 8: return f"{date_str[:2]}/{date_str[2:4]}/{date_str[4:]}" return date_str df['formatted_date'] = df['extracted_date'].apply(format_date)
最终结果:
| description | extracted_date | formatted_date |
|---|---|---|
| A CAKE 01/02/1989 | 01/02/1989 | 01/02/1989 |
| information 22031970 | 22031970 | 22/03/1970 |
| some text | NaN | NaN |
| values 12345678987 | NaN | NaN |
补充说明
- 正则表达式
(\d{2}/\d{2}/\d{4}|\d{8})确保只匹配符合日期长度的字符串,避免提取非日期的数字串。 - 如果需要把NaN替换成空字符串或其他默认值,可添加:
df['formatted_date'] = df['formatted_date'].fillna('')
内容的提问来源于stack exchange,提问作者Lok
相关产品推荐
相关产品推荐

