按周聚合时间序列数据:设备rul与预测值的周度分组实现问询
按周度聚合设备剩余使用寿命数据的实现方案
需求背景
现有包含3年历史数据的DataFrame,字段包括rul(剩余使用寿命)、pred_diff、machineID(设备ID)、datetime(时间戳),需实现按设备+周度聚合,每个设备对应约156行(3年×52周)结果,无数据的周需保留空行并按需填充。
实现步骤
1. 标准化时间字段,生成全量周序列
先统一时间格式,然后生成覆盖整个3年周期的所有周起始/结束日期,确保无遗漏:
import pandas as pd # 确保datetime为datetime类型 y_test['datetime'] = pd.to_datetime(y_test['datetime']) # 获取数据集的时间边界,计算覆盖全周期的周序列(以每周一作为周起始) min_dt = y_test['datetime'].min() max_dt = y_test['datetime'].max() all_weeks = pd.date_range( start=min_dt - pd.Timedelta(days=min_dt.weekday()), # 对齐到周一 end=max_dt + pd.Timedelta(days=6 - max_dt.weekday()), # 对齐到周日 freq='W-MON' # 每周生成一条周一的日期,可替换为W-SUN用周日作为周结束 )
2. 构建设备-周的笛卡尔积网格
生成每个设备与所有周的组合,保证每个设备的每一周都有对应的记录:
# 获取所有唯一设备ID machine_ids = y_test['machineID'].unique() # 生成设备ID与周序列的笛卡尔积 machine_week_grid = pd.MultiIndex.from_product( [machine_ids, all_weeks], names=['machineID', 'week_start'] ).reset_index(drop=True)
3. 给原始数据标记所属周
将每条原始数据映射到对应的周起始日期,方便后续关联:
# 计算每条数据对应的周起始日期(与all_weeks的规则一致) y_test['week_start'] = y_test['datetime'] - pd.to_timedelta(y_test['datetime'].dt.weekday, unit='D')
4. 关联数据并按周聚合
通过左连接保留所有设备-周组合,然后聚合计算所需指标,处理无数据的周:
# 左连接网格与原始数据,确保所有周都被保留 merged_data = machine_week_grid.merge(y_test, on=['machineID', 'week_start'], how='left') # 按设备+周聚合,计算rul和pred_diff的均值(可替换为sum/max等统计量) weekly_agg_result = merged_data.groupby(['machineID', 'week_start']).agg( avg_rul=('rul', 'mean'), avg_pred_diff=('pred_diff', 'mean') ).reset_index() # 处理无数据的周:填充NaN为0或其他默认值,根据业务需求调整 weekly_agg_result = weekly_agg_result.fillna(0)
结果说明
最终的weekly_agg_result中,每个machineID对应3年周期内的所有周记录(约156行),无数据的周会用指定值填充,完全满足需求。
内容的提问来源于stack exchange,提问作者PeakyBlinder
相关产品推荐
相关产品推荐

