如何编写正则匹配含Oct,16 , 2012的多日期格式并提取pandas序列中日期
解决方法
匹配所需日期格式的正则
要匹配Oct, 16 , 2012这类月份缩写加逗号分隔的日期,以及12/4/2012这类斜杠分隔的日期,可以用以下正则表达式:
(?:[A-Z][a-z]{2},\s*\d{1,2}\s*,\s*\d{4}|\d{1,2}/\d{1,2}/\d{4})
各部分含义:
[A-Z][a-z]{2}:匹配首字母大写、后两位小写的3字符月份缩写(如Oct、Nov)\s*:匹配任意数量的空白字符,兼容日期前后多余的空格\d{1,2}:匹配1-2位的日期/月份数值\d{4}:匹配4位年份|:分支匹配,同时支持两种日期格式- 外层
(?:)表示非捕获分组,提取时直接返回完整的日期字符串
pandas 提取实现步骤
直接调用pandas字符串内置的findall方法即可批量提取,示例代码如下:
import pandas as pd # 你的原始pandas序列,这里替换成你自己的变量名 date_series = pd.Series([ "2012-05-25 00:00:00", "2012-08-28 00:00:00", "2012-08-22 00:00:00", "2012-10-16 00:00:00", "Oct, 16 , 2012/ Nov, 1, 2012", "2012-05-20 00:00:00", "2012-10-30 00:00:00", "2012-11-12 00:00:00", "2012-12-04 00:00:00", "12/4/2012, 16/4/2012" ]) # 提取所有匹配的日期 date_pattern = r'(?:[A-Z][a-z]{2},\s*\d{1,2}\s*,\s*\d{4}|\d{1,2}/\d{1,2}/\d{4})' # 如果只需要索引为4和9的两行,改为 date_series.loc[[4,9]] extracted_dates = date_series.str.findall(date_pattern) # 扁平化结果并去重得到最终列表 result = list({date for sub in extracted_dates for date in sub if sub})
如果你需要把提取到的字符串转成标准datetime格式,可以分别处理两种格式:
- 月份缩写格式:
pd.to_datetime(date_str, format='%b, %d , %Y') - 斜杠分隔格式:
pd.to_datetime(date_str, format='%d/%m/%Y')(示例中16为日期,所以是日/月/年顺序)
内容的提问来源于stack exchange,提问作者Ymh
相关产品推荐
相关产品推荐

