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

如何按员工编号补全DataFrame中日期不连续的行

解决员工日期连续性补全问题

步骤1:准备初始数据(示例)

先将日期列转为datetime类型,保证后续日期计算逻辑正常:

import pandas as pd
from datetime import timedelta

# 示例初始数据
data = {
    'Employee Number': ['E001', 'E001', 'E001', 'E002', 'E002'],
    'Start Date': ['2020-01-01', '2020-03-01', '2020-05-01', '2021-01-01', '2021-04-01'],
    'End Date': ['2020-02-28', '2020-04-30', '2020-06-30', '2021-03-31', '2021-05-31']
}
df = pd.DataFrame(data)
df['Start Date'] = pd.to_datetime(df['Start Date'])
df['End Date'] = pd.to_datetime(df['End Date'])

步骤2:添加Continuous Flag列

按员工分组,对比当前行结束日期的次日与下一行起始日期是否连续,标记Y/N;每个员工的最后一行标记为NaN:

# 生成连续性标记
df['Continuous Flag'] = df.groupby('Employee Number').apply(
    lambda x: (x['End Date'] + timedelta(days=1) == x['Start Date'].shift(-1))
).reset_index(level=0, drop=True).map({True: 'Y', False: 'N'})

# 最后一行标记为缺失值
df.loc[df.groupby('Employee Number').tail(1).index, 'Continuous Flag'] = pd.NA

标记后的数据示例(节选):

Employee NumberStart DateEnd DateContinuous Flag
E0012020-01-012020-02-28Y
E0012020-03-012020-04-30N
E0012020-05-012020-06-30

步骤3:补全日期区间

编写分组处理函数,对标记为N的行插入中间补全行,对最后一行补至2023-01-01:

def fill_date_gaps(group):
    filled_records = []
    for idx, row in group.iterrows():
        filled_records.append(row)
        # 处理非最后一行且标记为N的情况,补全中间断档
        if row['Continuous Flag'] == 'N':
            next_start = group.iloc[idx+1]['Start Date']
            new_end = next_start - timedelta(days=1)
            gap_row = row.copy()
            gap_row['Start Date'] = row['End Date'] + timedelta(days=1)
            gap_row['End Date'] = new_end
            gap_row['Continuous Flag'] = 'Y'
            filled_records.append(gap_row)
        # 处理最后一行,补至2023-01-01
        elif pd.isna(row['Continuous Flag']):
            target_end = pd.to_datetime('2023-01-01')
            if row['End Date'] < target_end:
                final_row = row.copy()
                final_row['Start Date'] = row['End Date'] + timedelta(days=1)
                final_row['End Date'] = target_end
                filled_records.append(final_row)
    return pd.DataFrame(filled_records)

# 应用函数到每个员工分组,生成最终结果
final_df = df.groupby('Employee Number', group_keys=False).apply(fill_date_gaps).reset_index(drop=True)

最终输出示例(E001部分):

Employee NumberStart DateEnd DateContinuous Flag
E0012020-01-012020-02-28Y
E0012020-03-012020-04-30N
E0012020-05-012020-05-01Y
E0012020-05-012020-06-30
E0012020-07-012023-01-01NaN

关键说明

  • 必须按Employee Number分组处理,确保每个员工的日期序列独立计算
  • 用shift(-1)获取下一行的起始日期,避免手动循环索引时的边界错误
  • 补全行时复用原行的其他字段(示例仅展示核心列,实际可保留所有原有字段)

内容的提问来源于stack exchange,提问作者Daniel Quintero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:10:12