如何基于另一DataFrame的时间区间过滤目标DataFrame数据?
解决DataFrame区间筛选结果被覆盖的问题
你的问题出在循环赋值逻辑上:每次循环都直接用data = df1.loc[...]覆盖之前的结果,前面区间筛选出的数据会被后续循环的结果覆盖,所以最后只保留了最后一次循环(id=32)的筛选结果。
解决方案1:用列表收集所有区间结果,最后合并
修改循环逻辑,把每个区间的筛选结果存入列表,最后合并成完整的DataFrame:
import pandas as pd # 初始化空列表存储每个区间的筛选结果 result_list = [] for i in range(len(df2)): t1 = df2.loc[i, 'DatetimeStart'] t2 = df2.loc[i, 'DatetimeEnd'] # 筛选当前时间区间内的df1数据 filtered_data = df1.loc[(df1['datetimeUTC'] >= t1) & (df1['datetimeUTC'] <= t2)] # 可选:将df2对应的meanKGH字段关联到筛选结果中 filtered_data['meanKGH'] = df2.loc[i, 'meanKGH'] # 将结果添加到列表 result_list.append(filtered_data) # 合并所有区间的结果为一个DataFrame final_data = pd.concat(result_list, ignore_index=True)
解决方案2:用apply简化逻辑(推荐)
避免手动遍历索引,用apply遍历df2的每一行,自动筛选并收集结果:
import pandas as pd def filter_by_interval(row): # 生成当前行时间区间的筛选掩码 mask = (df1['datetimeUTC'] >= row['DatetimeStart']) & (df1['datetimeUTC'] <= row['DatetimeEnd']) # 筛选数据并关联meanKGH字段 temp_df = df1[mask].copy() temp_df['meanKGH'] = row['meanKGH'] return temp_df # 遍历df2每一行执行筛选,合并所有结果 final_data = pd.concat(df2.apply(filter_by_interval, axis=1).tolist(), ignore_index=True)
内容的提问来源于stack exchange,提问作者reday3
相关产品推荐
相关产品推荐

