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

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)

关键步骤说明

  1. 正则分支设计:

    • 第一个分支匹配MM/DD/YYYY或MM/DD/YY格式,精准捕获月、日、年三个字段。
    • 第二个分支匹配MM/YYYY或MM/YY格式,捕获月、年两个字段。
    • 用非捕获组(?:...)避免生成多余的分组列,简化后续数据整理。
  2. 分组结果合并:

    • 通过combine_first合并两个分支的月、年字段,确保所有日期的核心信息被正确提取。
    • 日字段仅在带日的日期中有值,无日记录自动保留NaN。
  3. 年份统一与排序:

    • 将两位年份转换为四位(如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:33:11