Pandas中如何基于df2的日期时间区间条件从df1匹配数据并计算均值
区间匹配聚合实现方案
针对带时间范围的逐行数据匹配、组内均值计算需求,可通过Pandas内置的向量化区间匹配能力实现,全程无需编写显式循环,运行效率远高于逐行筛选的方式。
前置数据格式校准
先统一两个DataFrame的时间列格式,避免格式不匹配导致的匹配失败:
- 转换df1的逐小时时间列为标准datetime格式:
df1['time'] = pd.to_datetime(df1['time']) - 转换df2的slot起止时间列为标准datetime格式:
df2['slot_start'] = pd.to_datetime(df2['slot_start']) df2['slot_end'] = pd.to_datetime(df2['slot_end'])
构造可匹配的时间区间索引
将df2中每个slot的起止时间打包为左闭右闭的时间区间,完全匹配「起始日期 ≤ df1.time ≤ 结束日期」的筛选逻辑,注意这里必须指定区间为双闭,否则会遗漏slot起始时刻的观测数据:
slot_interval_index = pd.IntervalIndex.from_arrays( left=df2['slot_start'], right=df2['slot_end'], closed='both' )
向量化匹配与均值计算
无需逐行遍历df2的slot做筛选,直接将df1的每条逐小时观测数据匹配到所属的slot区间,按区间分组计算波高均值:
# 按所属slot分组计算波高均值 slot_wave_avg = df1.groupby( pd.cut(x=df1['time'], bins=slot_interval_index) )['wave_height'].mean()
结果回填到df2
上述计算得到的均值序列与df2的行顺序完全对齐,直接将值赋值为df2的新列即可:
df2['wave_height_avg'] = slot_wave_avg.values
注意事项:如果存在slot范围超出df1的时间覆盖区间、未匹配到有效观测的情况,对应位置会自动填充NaN,可根据实际需求选择是否过滤这类无效slot,或补充自定义填充规则。
内容的提问来源于stack exchange,提问作者Keyser Soze
相关产品推荐
相关产品推荐

