如何在循环中依据ID和日期双条件匹配数据并填充数据表
解决ID与日期匹配填充Power数据的高效方法
方法一:Excel公式实现(适合小数据集手动处理)
针对目标表中每个ID列的单元格,使用INDEX+MATCH组合公式判断日期是否在运营区间内,匹配对应Power值:
以目标表El_Bel列的B2单元格为例,输入公式后下拉填充:
=IF(AND($A2>=INDEX(源数据!$D:$D,MATCH("El_Bel",源数据!$A:$A,0)),$A2<=INDEX(源数据!$E:$E,MATCH("El_Bel",源数据!$A:$A,0))),INDEX(源数据!$B:$B,MATCH("El_Bel",源数据!$A:$A,0)),"")
- 替换公式中的
"El_Bel"为对应列的ID(如"El_Opo"、"El_Tur")即可适配其他列 - 公式逻辑:先定位ID在源数据中的行,取出运营起止日期,判断当前Date是否在区间内,是则返回Power值,否则留空
如果源数据量较大,也可以用XLOOKUP简化多条件判断:
=IF(AND($A2>=XLOOKUP("El_Bel",源数据!$A:$A,源数据!$D:$D),$A2<=XLOOKUP("El_Bel",源数据!$A:$A,源数据!$E:$E)),XLOOKUP("El_Bel",源数据!$A:$A,源数据!$B:$B),"")
方法二:Python Pandas批量处理(适合大数据集自动化)
如果需要处理批量数据,用Pandas可以高效完成数据展开、透视和匹配:
import pandas as pd # 1. 读取源数据和目标表(实际场景可替换为pd.read_excel/pd.read_csv) source_df = pd.DataFrame({ "ID": ["El_Bel", "El_Opo", "El_Tur"], "Power": [344, 256, 400], "Starting_date": [1983, 1987, 2019], "Shutting_down_date": [2030, 2027, 2049] }) target_df = pd.DataFrame({ "Date": [2017, 2018, 2019, 2020, 2021] }) # 2. 展开每个ID的运营日期范围 expanded_rows = [] for _, item in source_df.iterrows(): # 生成运营区间内的所有年份 years = range(item["Starting_date"], item["Shutting_down_date"] + 1) expanded_rows.extend([{"Date": y, "ID": item["ID"], "Power": item["Power"]} for y in years]) expanded_df = pd.DataFrame(expanded_rows) # 3. 透视成目标表的宽格式,合并到目标表 pivot_result = expanded_df.pivot(index="Date", columns="ID", values="Power").reset_index() final_df = target_df.merge(pivot_result, on="Date", how="left").fillna("") print(final_df)
- 代码逻辑:先将每个ID的运营区间展开为「年份-ID-Power」的行数据,再透视成目标表的列格式,最后与目标表按Date合并,空值留空
- 此方法可处理上万条数据,且支持后续批量更新源数据后快速重新生成结果
内容的提问来源于stack exchange,提问作者bLanton70
相关产品推荐
相关产品推荐

