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

如何在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合并,得到你需要的输出格式

运行代码后,你会得到符合预期的结果:

datesPD1ND1PD2ND2
10-Mar-22,9-Apr-2209-Mar-2211-Mar-2208-Apr-2210-Apr-22
5-Jan-22 to 1-Mar-22,10-Mar-22 to 7-May-2204-Jan-2202-Mar-2209-Mar-2208-May-22

(注:你给出的预期输出中第一行的ND1写成了1-Mar-22,应该是笔误,正确的后一天应为11-Mar-22)

内容的提问来源于stack exchange,提问作者anjali joshi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:03:15