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

如何使用for循环或其他方法基于日期范围填充两个DataFrame的对应值

解决方案

首先确保df1的Start和End列是datetime类型(如果还没转换的话):

df1['Start'] = pd.to_datetime(df1['Start'])
df1['End'] = pd.to_datetime(df1['End'])

方法一:For循环实现(适合新手理解逻辑)

遍历df1的每条记录,定位到df2中对应员工、对应日期的位置填充类型:

# 确保df2的列是datetime类型,避免日期匹配问题
df2.columns = pd.to_datetime(df2.columns)

# 逐行处理df1的记录
for _, row in df1.iterrows():
    code = row.name  # Code是df1的索引
    start = row['Start']
    end = row['End']
    entry_type = row['entry_type']
    
    # 生成当前记录覆盖的所有日期(包含首尾)
    date_list = pd.date_range(start=start, end=end, freq='D')
    # 只保留df2中存在的日期(避免超出范围)
    valid_dates = date_list[date_list.isin(df2.columns)]
    
    # 填充df2对应位置
    df2.loc[code, valid_dates] = entry_type

如果同一员工同一日期有多条记录,后面的记录会覆盖前面的,符合“最新记录优先”的逻辑。


方法二:向量化高效实现(推荐,大数据量更快)

利用Pandas内置函数展开日期区间再转宽表,避免循环:

# 1. 将每条记录的日期区间拆分为单独的日期行
df1_expanded = df1.assign(
    Date=lambda x: [pd.date_range(s, e, freq='D') for s, e in zip(x['Start'], x['End'])]
).explode('Date')

# 2. 转换为df2的宽表格式,重复日期取最后一条记录的类型
df2 = df1_expanded.pivot_table(
    index='Code', 
    columns='Date', 
    values='entry_type', 
    aggfunc='last'
)

# 3. 重新索引,确保包含所有需要的日期和员工(和原始df2结构一致)
all_dates = pd.date_range(start=df1['Start'].min(), end=df1['End'].max(), freq='D')
all_codes = df1.index.unique()
df2 = df2.reindex(index=all_codes, columns=all_dates)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:27:43