You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 00:18:38