Python DataFrame如何实现每2行求和以对齐1小时频率数据
30分钟粒度功率数据转1小时粒度对齐实现方案
前置处理:先规范30分钟粒度DataFrame的时间格式,这是所有操作的基础
import pandas as pd # 此处替换为你自己的列名:dt为时间列名,power_kwh为30分钟功率值列名 df_30min['dt'] = pd.to_datetime(df_30min['dt']) # 将时间列设为索引并排序,规避时间乱序导致的计算错误 df_30min = df_30min.set_index('dt').sort_index()
方法一:pandas时间重采样(生产环境优先选,容错性最高)
不推荐直接写死相邻两行求和的逻辑——一旦原始数据存在缺测、时间跳变、乱序问题,硬编码相邻行计算会直接产出错误结果。用pandas原生重采样接口按自然时间窗口聚合,稳定性更高:
# 按1小时窗口做聚合,输出格式和需求完全匹配 df_1h_from30 = df_30min.resample( rule='1H', label='left', # 聚合后时间标签取小时窗口的起始时间 closed='left' # 时间窗口包含左边界节点,符合30分钟数据的统计规则 ).sum().reset_index()
关键参数说明:
label='left':保证03:00-04:00的聚合结果对应时间标签为2021-05-01 03:00:00,和给出的期望输出一致closed='left':避免时间窗口边界值被错误划分到相邻窗口- 自动处理缺测数据:如果某个小时缺30分钟记录,重采样会自动按现有值求和,不会把下一小时的30分钟数据错算到当前小时
方法二:相邻行分组求和(仅适用于数据完全规范的场景)
如果你100%确认原始30分钟数据无缺失、无乱序、严格按照30分钟间隔连续排列,可以用行号分组的方式快速计算:
df_temp = df_30min.reset_index() # 行号整除2实现每两行划分为一组 df_1h_from30 = df_temp.groupby(df_temp.index // 2).agg( dt = ('dt', 'first'), power_kwh = ('power_kwh', 'sum') )
与原有1小时粒度DataFrame对齐做对比
转换完成后,两个DataFrame的时间粒度已经完全统一,直接按时间列关联即可得到可直接对比的宽表:
# df_1h为你原有的1小时粒度DataFrame,注意提前把它的时间列也转成datetime格式 df_1h['dt'] = pd.to_datetime(df_1h['dt']) # 关联两个表,后缀区分不同来源的功率值 df_compare = pd.merge( left=df_1h, right=df_1h_from30, on='dt', suffixes=('_raw_1h', '_agg_from_30min') )
小提示:如果两个表的时间存在秒级/分钟级的微小偏移,可以在关联前对两个1小时粒度的表都做一次1H重采样,强制对齐时间轴,避免匹配失败。
内容的提问来源于stack exchange,提问作者BenjiBoy
相关产品推荐
相关产品推荐

