使用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
相关产品推荐
相关产品推荐

