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

