如何用正则将pandas日期列拆分为start和end两列
实现方案
你可以通过str.findall匹配所有符合dd.mm.yyyy格式的日期,再按提取结果的长度分别赋值给start和end列即可,无需复杂的正则分组适配不同分隔符:
完整可运行代码
import pandas as pd # 构造示例数据 df = pd.DataFrame({'dates': ['start 01.01.2020', 'start 10.10.2019, end 20.20.2019', '01.05.2019', '01.11.2019-04.11.2019']}) # 提取所有符合dd.mm.yyyy格式的独立日期,返回每行的日期列表 date_list = df['dates'].str.findall(r'\b\d{2}\.\d{2}\.\d{4}\b') # 赋值start和end列:只有一个日期时首尾取值相同 df['start'] = date_list.str[0] df['end'] = date_list.str[-1] # 可选:将字符串转为标准datetime格式,非法日期(如示例中的20.20.2019)会转为NaT df['start'] = pd.to_datetime(df['start'], format='%d.%m.%Y', errors='coerce') df['end'] = pd.to_datetime(df['end'], format='%d.%m.%Y', errors='coerce') print(df)
输出结果
| dates | start | end |
|---|---|---|
| start 01.01.2020 | 2020-01-01 | 2020-01-01 |
| start 10.10.2019, end 20.20.2019 | 2019-10-10 | NaT |
| 01.05.2019 | 2019-05-01 | 2019-05-01 |
| 01.11.2019-04.11.2019 | 2019-11-01 | 2019-11-04 |
逻辑说明
- 正则
\b\d{2}\.\d{2}\.\d{4}\b自动过滤start、end、逗号、横杠等无关字符,只匹配符合格式的日期 - 当行内仅提取到1个日期时,
str[0]和str[-1]取值完全相同,自动满足仅含起始日期时start和end一致的要求 - 如果需要保留原始字符串格式的日期,去掉
pd.to_datetime转换步骤即可
内容的提问来源于stack exchange,提问作者user3306199
相关产品推荐
相关产品推荐

