Python Pandas:正则提取多格式日期并拆分排序的技术问题
解决Pandas Series中提取多格式日期并拆分排序的问题
问题核心
原正则表达式的可选分组逻辑错误,导致年份被错误拆分;需要同时兼容MM/YYYY和MM/DD/YY两种日期格式,将缺失的日字段用NaN填充后完成排序。
解决方案代码
import pandas as pd # 原始文本Series s = pd.Series([ '1/1994 Primary Care Doctor:', 'sshe plans to move as of 7/8/71 In-Home Services: None', 'Reports MRI of brain done 12/2004 at Gravette Medical Center was WNLPrior EEG:' ]) # 正则分支:优先匹配带日的日期,再匹配仅月年的日期 pattern = r'(?:(\d{1,2})[/-](\d{1,2})[/-](\d{2,4}))|(?:(\d{1,2})[/-](\d{2,4}))' # 提取所有匹配的日期分组 extracted = s.str.extractall(pattern) # 合并分支结果,整理为月、日、年三列 extracted['month'] = extracted[0].combine_first(extracted[3]) extracted['day'] = extracted[1] # 无日的记录自动填充NaN extracted['year'] = extracted[2].combine_first(extracted[4]) # 筛选目标列并重置索引 date_df = extracted[['month', 'day', 'year']].reset_index(drop=True) # 转换为数值类型,方便后续处理 date_df = date_df.apply(pd.to_numeric, errors='coerce') # 处理两位年份(可根据业务调整规则,此处默认19xx) date_df['year'] = date_df['year'].apply(lambda x: x + 1900 if x < 100 else x) # 按年、月、日排序 date_df = date_df.sort_values(by=['year', 'month', 'day']).reset_index(drop=True) print(date_df)
关键步骤说明
正则分支设计:
- 第一个分支匹配
MM/DD/YYYY或MM/DD/YY格式,精准捕获月、日、年三个字段。 - 第二个分支匹配
MM/YYYY或MM/YY格式,捕获月、年两个字段。 - 用非捕获组
(?:...)避免生成多余的分组列,简化后续数据整理。
- 第一个分支匹配
分组结果合并:
- 通过
combine_first合并两个分支的月、年字段,确保所有日期的核心信息被正确提取。 - 日字段仅在带日的日期中有值,无日记录自动保留
NaN。
- 通过
年份统一与排序:
- 将两位年份转换为四位(如
71→1971),可根据实际业务调整规则(比如2000年后的两位年可改为x + 2000)。 - 按
year→month→day的优先级排序,得到符合逻辑的日期序列。
- 将两位年份转换为四位(如
最终输出
month day year 0 7 8.0 1971.0 1 1 NaN 1994.0 2 12 NaN 2004.0
内容的提问来源于stack exchange,提问作者JFK
相关产品推荐
相关产品推荐

