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

使用Pandas基于日期列扩展DataFrame行的需求实现问询

Pandas基于日期列扩展DataFrame行的需求实现问询

嘿,我来帮你搞定这个用Pandas扩展日期行的需求!先理清楚你的核心需求,然后一步步给出实现方案:

需求回顾

  • 如果Start Date和End Date值相同,直接保留原行
  • 如果End Date晚于Start Date,按每日拆分,每行的Start Date和End Date都设为当天
  • 如果End Date为空,从Start Date开始生成行,直到指定的截止日期(你指定的是2023-03-30,示例里出现31可能是笔误,代码里可以灵活调整)

实现代码

首先我们先构建原始数据并处理日期格式,再通过自定义函数来扩展行:

import pandas as pd

# 1. 构建原始DataFrame
raw_data = {
    'ID': [1, 1, 2, 3],
    'Leave Type': ['Sick', 'Holiday', 'Holiday', 'Work'],
    'Start Date': ['2022-01-01', '2023-03-28', '2023-01-01', '2023-01-01'],
    'End Date': ['2022-01-01', None, '2023-01-02', '2023-01-01']
}
df = pd.DataFrame(raw_data)

# 2. 将日期列转换为datetime类型,方便后续运算
df['Start Date'] = pd.to_datetime(df['Start Date'])
df['End Date'] = pd.to_datetime(df['End Date'])

# 3. 设置End Date为空时的截止日期
cutoff_date = pd.to_datetime('2023-03-30')  # 如果需要和示例一致改成2023-03-31即可

# 4. 定义扩展日期行的函数
def expand_single_row(row):
    start_date = row['Start Date']
    # 处理End Date为空的情况,替换为截止日期
    end_date = row['End Date'] if pd.notna(row['End Date']) else cutoff_date
    # 生成从start到end的每日日期序列
    daily_dates = pd.date_range(start=start_date, end=end_date, freq='D')
    # 为每个日期生成对应的行数据
    return [
        {
            'ID': row['ID'],
            'Leave Type': row['Leave Type'],
            'Start Date': dt,
            'End Date': dt
        } for dt in daily_dates
    ]

# 5. 应用函数并拆分行
expanded_df = df.apply(expand_single_row, axis=1).explode().apply(pd.Series)

# 6. 重置索引,让结果更整洁
expanded_df = expanded_df.reset_index(drop=True)

# 查看最终结果
print(expanded_df)

代码说明

  • 先把日期列转为datetime类型是关键,这样才能正常进行日期范围生成和运算
  • expand_single_row函数会针对每一行,根据Start Date和End Date(或截止日期)生成所有需要的日期,再把每个日期转换成单独的行字典
  • 用apply+explode的组合,把每行生成的列表拆分成独立的行,最后转成标准DataFrame格式

运行这段代码后,就能得到你想要的拆分结果啦。

备注:内容来源于stack exchange,提问作者Paulo Cortez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:59:08