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

