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

Pandas中保留正则匹配的混合日期并清除其余内容的问题求助

解决Pandas中提取CSV列内混合日期格式的问题

嘿,我明白你遇到的问题了——你写的正则其实能正确匹配目标日期,但str.replace的用法搞反了,导致把想要保留的日期给删掉了,咱们来一步步搞定它:

问题出在哪?

你的正则表达式是用来匹配日期的,但df['Date'].str.replace(pattern, '')的逻辑是:找到所有符合pattern的内容,然后替换成空字符串。这就相当于把日期删掉,剩下了那些无关的括号、大括号之类的内容,完全和你想要的相反。

方案1:用str.extract直接提取日期(更推荐)

既然咱们的目标是把日期拎出来,直接用str.extract会更直观,也不容易出错。只需要给你的正则外层加个捕获组,就能直接提取每行里的日期:

import pandas as pd

# 修正原代码的小问题:read_csv要赋值给变量,且它本身返回DataFrame,无需额外转换
df = pd.read_csv('path')
df.columns = ['Date']

# 你的正则,外层加括号作为捕获组,方便extract提取目标内容
date_pattern = r'((\b(0?[1-9]|[12]\d|30|31)[^\w\d\r\n:](0?[1-9]|1[0-2])[^\w\d\r\n:](\d{4}|\d{2})\b)|(\b(0?[1-9]|1[0-2])[^\w\d\r\n:](0?[1-9]|[12]\d|30|31)[^\w\d\r\n:](\d{4}|\d{2})\b))'

# 提取日期,expand=False让结果保持Series格式,和原列匹配
df['Date'] = df['Date'].str.extract(date_pattern, expand=False)

# 查看处理后的结果
print(df['Date'])

用这个方法,直接把每行里匹配到的日期提取出来,自动忽略所有无关内容,正好符合你要的输出。

方案2:调整正则,用str.replace删掉非日期内容

如果你非要用str.replace,那得换个思路:匹配整个字符串,只保留日期部分,把其他内容替换掉:

import pandas as pd

df = pd.read_csv('path')
df.columns = ['Date']

# 正则逻辑:匹配整个字符串,把中间的日期作为捕获组,替换整个字符串为捕获到的日期
df['Date'] = df['Date'].str.replace(
    r'^.*?((\b(0?[1-9]|[12]\d|30|31)[^\w\d\r\n:](0?[1-9]|1[0-2])[^\w\d\r\n:](\d{4}|\d{2})\b)|(\b(0?[1-9]|1[0-2])[^\w\d\r\n:](0?[1-9]|[12]\d|30|31)[^\w\d\r\n:](\d{4}|\d{2})\b)).*$',
    r'\1'
)

这里^.*?匹配开头的所有无关字符(非贪婪模式,避免吃掉日期),.*$匹配日期后面的所有无关字符,最后用\1替换成捕获到的日期,就把无关内容都删掉了。

测试结果

用你给的示例数据测试,两种方案都能得到你想要的结果:

0    21/04/2004
1     6/07/2004
2     6/10/2004
3    16/06/2004
4    21/06/2004
5     1/03/2018
6      23/03/17
7     4/04/2006
8    19/05/2006
9     3/04/2006
Name: Date, dtype: object

内容的提问来源于stack exchange,提问作者non_linear

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 12:52:42