基于时间戳合并Pandas DataFrame功率列的高效方法问询
高效合并不同时间间隔的Pandas功率数据
需要将两个Pandas DataFrame中时间戳(Unix时间戳)对应的功率值相加,但两个DataFrame的时间间隔存在差异(通常6秒,偶尔波动),且起止时间不同但有重叠区间。最初考虑的每秒插值重索引方法会大幅增加数据量、降低性能,以下是更高效的实现方案。
示例数据
df1
time power 0 1355526770 1500 1 1355526776 1800 2 1355526782 1600 3 1355526788 1700 4 1355526794 1400
df2
time power 0 1355526771 1250 1 1355526777 1200 2 1355526783 1280 3 1355526789 1290 4 1355526795 1300
高效实现方案
核心思路是仅在两个DataFrame的所有时间点的并集上进行插值,避免全量生成每秒数据,同时保证计算精度:
- 提取两个DataFrame的时间列,合并后去重并排序,得到需要计算的所有时间点集合
- 将两个DataFrame分别设置时间列为索引,在目标时间点上重索引并执行线性插值
- 对插值后的功率列求和,得到最终结果
代码实现
import pandas as pd # 示例数据构造 df1 = pd.DataFrame({ 'time': [1355526770, 1355526776, 1355526782, 1355526788, 1355526794], 'power': [1500, 1800, 1600, 1700, 1400] }) df2 = pd.DataFrame({ 'time': [1355526771, 1355526777, 1355526783, 1355526789, 1355526795], 'power': [1250, 1200, 1280, 1290, 1300] }) # 步骤1:获取合并后的时间点(去重、排序) all_times = pd.Series(pd.concat([df1['time'], df2['time']]).unique()).sort_values() # 步骤2:设置索引并插值 df1_interp = df1.set_index('time').reindex(all_times).interpolate(method='linear', limit_area='inside') df2_interp = df2.set_index('time').reindex(all_times).interpolate(method='linear', limit_area='inside') # 步骤3:合并计算总功率 result = pd.DataFrame({ 'time': all_times, 'total_power': df1_interp['power'] + df2_interp['power'] }).reset_index(drop=True) print(result)
关键说明
limit_area='inside'参数确保只在原始数据的起止时间范围内插值,避免对超出数据区间的时间点生成无意义的插值结果- 仅在两个DataFrame的时间点并集上计算,数据量仅为原始两个DataFrame行数之和(去重后),性能远高于每秒插值方案
- 线性插值可以保证功率值随时间的连续变化符合实际场景
如果只需要重叠区间内的结果,可以在最后一步过滤时间范围:
# 计算重叠时间区间 start_time = max(df1['time'].min(), df2['time'].min()) end_time = min(df1['time'].max(), df2['time'].max()) # 过滤重叠区间数据 result_overlap = result[(result['time'] >= start_time) & (result['time'] <= end_time)]
内容的提问来源于stack exchange,提问作者Thomas Lee Young
相关产品推荐
相关产品推荐

