如何使用Pandas从数据列中提取2000年及之后的日期(正则表达式实现需求)
如何使用Pandas从数据列中提取2000年及之后的日期(正则表达式实现需求)
没问题,我来帮你搞定这个问题~ 你的需求我仔细梳理了:要从DataFrame里提取2000年及以后的日期,规则是:
- 优先从
Result列提取,提取到就保留纯日期部分(自动去掉后面的时间); - 如果
Result列是空白/空字符串,就从Unit列提取日期; - 其他情况(
Result列有非日期内容),即使Unit列有日期也留空。
不用怕正则,我会把每部分都讲得明明白白,代码直接就能用~
正则思路说明
我们需要匹配两种常见的目标日期格式,且年份必须是2000年及以后:
- 数字分隔格式:
DD/MM/YYYY(比如03/08/2024) - 带月份缩写的格式:
DD/Mon/YYYY(比如03/Aug/2024,月份是3个字母的英文缩写)
专门针对需求写的正则模式是:
(\d{1,2}/(?:\d{1,2}|[A-Za-z]{3})/(?:20\d{2}|21\d{2}))
给你拆解下每个部分的作用:
\d{1,2}/:匹配1-2位的日期数字,加上斜杠(比如03/)(?:\d{1,2}|[A-Za-z]{3})/:非捕获组,匹配1-2位的月份数字(比如08)或者3个字母的月份缩写(比如Aug),再加上斜杠(?:20\d{2}|21\d{2}):非捕获组,匹配2000-2199之间的年份,严格保证是2000年及以后的有效年份- 整个外层的
()是捕获组,专门提取我们需要的纯日期部分,后面的时间会被自动忽略,刚好符合你只留日期的需求
完整代码实现
import pandas as pd # 你的原始数据集 date_extract_df = pd.DataFrame({ 'Result':[': XYZ',': 39 YRS/M',': Self',': HOME COLLECTION',': 10593974', ': 012408030006',': 03/08/2024',': 03/Aug/2024 11:50 AM',': 03/Aug/2024 03:24 PM', ' ','31.80','15'], 'Unit':['dfd','dfdfd','tytyt','03/08/2024','fgf','tyt','xcx','ere','sds','03/Aug/2024 03:24 PM', '4545','5656'] }) # 定义匹配2000+日期的正则模式 date_pattern = r'(\d{1,2}/(?:\d{1,2}|[A-Za-z]{3})/(?:20\d{2}|21\d{2}))' # 1. 从Result列提取日期,提取不到的返回NaN result_dates = date_extract_df['Result'].str.extract(date_pattern, expand=False) # 2. 从Unit列提取日期,提取不到的返回NaN unit_dates = date_extract_df['Unit'].str.extract(date_pattern, expand=False) # 3. 按照需求合并结果: # - 只有当Result列是空白(或空字符串)时,才用Unit列的日期填充 # - 其他情况保持Result列的提取结果(空的就留空) mask = date_extract_df['Result'].str.strip() == '' extracted_dates = result_dates.where(~mask, unit_dates) # 把NaN替换为空白字符串,和你的预期格式完全匹配 extracted_dates = extracted_dates.fillna('').reset_index(drop=True) # 输出最终结果 print(extracted_dates.to_string(index=True))
运行结果
0 1 2 3 4 5 6 03/08/2024 7 03/Aug/2024 8 03/Aug/2024 9 03/Aug/2024 10 11
完全和你想要的预期结果一致啦!
如果之后遇到其他日期格式(比如YYYY/MM/DD),只需要稍微调整正则模式就行,你可以随时问我~
备注:内容来源于stack exchange,提问作者ViSa
相关产品推荐
相关产品推荐

