如何在Pandas DataFrame中为逗号分隔或范围形式的指定日期计算前一天与后一天
解决方案:处理Pandas中的复合日期格式并生成前后日期列
我来帮你搞定这个日期处理的需求!下面是一个完整的解决方案,能完美处理你提到的两种日期格式(逗号分隔的单个日期、"to"连接的日期范围),还支持多个条目并存的场景:
import pandas as pd import numpy as np # 初始化原始DataFrame df = pd.DataFrame({ 'dates': [ '10-Mar-22,9-Apr-22', '5-Jan-22 to 1-Mar-22,10-Mar-22 to 7-May-22' ] }) # 定义单个日期/日期范围的处理函数 def process_date_item(item): item = item.strip() if 'to' in item: # 处理日期范围:提取起始和结束日期,计算起始前一天、结束后一天 start_str, end_str = item.split(' to ') start_date = pd.to_datetime(start_str, format='%d-%b-%y') end_date = pd.to_datetime(end_str, format='%d-%b-%y') pd_val = (start_date - pd.Timedelta(days=1)).strftime('%d-%b-%y') nd_val = (end_date + pd.Timedelta(days=1)).strftime('%d-%b-%y') else: # 处理单个日期:计算该日期的前一天和后一天 date = pd.to_datetime(item, format='%d-%b-%y') pd_val = (date - pd.Timedelta(days=1)).strftime('%d-%b-%y') nd_val = (date + pd.Timedelta(days=1)).strftime('%d-%b-%y') return pd_val, nd_val # 定义整行的处理函数 def process_row(row): # 按逗号拆分每个单元格里的多个日期/日期范围条目 date_items = row['dates'].split(',') results = [] # 逐个处理每个条目,收集所有PD和ND值 for item in date_items: results.extend(process_date_item(item)) # 生成对应的列名(PD1、ND1、PD2、ND2...) col_names = [] for idx in range(1, len(date_items)+1): col_names.append(f'PD{idx}') col_names.append(f'ND{idx}') # 返回当前行的处理结果 return pd.Series(results, index=col_names) # 逐行处理原始DataFrame,展开得到PD/ND列 expanded_cols = df.apply(process_row, axis=1) # 合并原始数据和处理后的列 final_df = pd.concat([df, expanded_cols], axis=1) # 查看结果 print(final_df)
代码解释:
process_date_item函数:核心处理单元,负责识别单个日期和日期范围:- 如果条目包含"to",就拆分出起始和结束日期,分别计算起始日期的前一天(PD)和结束日期的后一天(ND)
- 如果是单个日期,直接计算该日期的前后一天
process_row函数:处理每行数据,先按逗号拆分多个日期条目,逐个调用process_date_item收集结果,再生成对应的列名- 最后拼接结果:用
apply逐行处理后,将生成的PD/ND列和原始DataFrame合并,得到你需要的输出格式
运行代码后,你会得到符合预期的结果:
| dates | PD1 | ND1 | PD2 | ND2 |
|---|---|---|---|---|
| 10-Mar-22,9-Apr-22 | 09-Mar-22 | 11-Mar-22 | 08-Apr-22 | 10-Apr-22 |
| 5-Jan-22 to 1-Mar-22,10-Mar-22 to 7-May-22 | 04-Jan-22 | 02-Mar-22 | 09-Mar-22 | 08-May-22 |
(注:你给出的预期输出中第一行的ND1写成了1-Mar-22,应该是笔误,正确的后一天应为11-Mar-22)
内容的提问来源于stack exchange,提问作者anjali joshi
相关产品推荐
相关产品推荐

