如何拆分DataFrame并按规则合并计算传感器时序数据?
解决方案
核心思路
先统一时间粒度到秒,处理同秒多记录的去重问题,再补全所有秒级时间点并用上一秒数据填充缺失,最后合并两个传感器的数据计算总和。
具体步骤及代码
假设你的DataFrame名为df,包含sensor_id、timestamp、current、apparent_power字段:
转换时间戳到秒级
先把timestamp转为datetime类型,再取整到秒,生成统一的秒级时间字段:import pandas as pd # 确保timestamp为datetime格式 df['timestamp'] = pd.to_datetime(df['timestamp']) # 生成秒级时间戳,统一时间粒度 df['second_ts'] = df['timestamp'].dt.floor('S')处理同秒多记录:每个传感器每秒仅保留一条
按传感器ID和秒级时间分组,取每组最后一条记录(也可根据业务需求用first()),消除同秒多条数据的异常:# 分组去重,确保每个传感器每秒只有一条数据 df_clean = df.groupby(['sensor_id', 'second_ts']).last().reset_index()补全秒级时间线,用前一秒数据填充缺失
拆分两个传感器的数据,补全所有存在的秒级时间点,并用ffill()自动填充缺失值:# 拆分两个传感器的干净数据 sensor0 = df_clean[df_clean['sensor_id'] == 0].set_index('second_ts') sensor1 = df_clean[df_clean['sensor_id'] == 1].set_index('second_ts') # 生成覆盖所有数据的完整秒级时间序列 all_seconds = pd.date_range(start=df_clean['second_ts'].min(), end=df_clean['second_ts'].max(), freq='S') # 重采样补全时间点,用上一秒数据填充缺失 sensor0_full = sensor0.reindex(all_seconds).ffill().reset_index().rename(columns={'index': 'second_ts'}) sensor1_full = sensor1.reindex(all_seconds).ffill().reset_index().rename(columns={'index': 'second_ts'})合并数据并计算总和
按秒级时间合并两个传感器的完整数据,最终计算电流和视在功率的总和:# 合并两个传感器的完整数据 merged_df = pd.merge(sensor0_full, sensor1_full, on='second_ts', suffixes=('_0', '_1')) # 计算总和字段 merged_df['total_current'] = merged_df['current_0'] + merged_df['current_1'] merged_df['total_apparent_power'] = merged_df['apparent_power_0'] + merged_df['apparent_power_1'] # 整理最终结果 final_df = merged_df[['second_ts', 'total_current', 'total_apparent_power']]
关键说明
- 同秒多记录处理:通过
groupby+聚合函数直接去重,避免重复计算 - 缺失值填充:
reindex补全时间点后用ffill()自动继承前一秒数据,无需手动循环 - 时间覆盖:
pd.date_range确保不会漏掉任何出现过的秒级时间点
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

