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

如何对含前一日末小时的日度重叠分组DataFrame应用函数?

解决方案

方法一:利用滚动窗口+重采样(高效简洁)

你的需求本质是对每天23:00的时间点,计算其前24小时内所有数据的聚合结果,可以用rolling结合resample快速实现:

import pandas as pd
import numpy as np

# 生成示例数据
i = pd.date_range('1999-12-31 23:00', '2000-01-10', freq='2H')
x = pd.DataFrame(index=i, data=np.random.randint(0,10, (len(i),2)), columns=['a','b'])

# 计算每个23:00对应的前24小时sum,按天提取结果
result = x.rolling('24H').sum().resample('D').last()

解释:

  • rolling('24H'):为每个时间点创建长度为24小时的滚动窗口,计算窗口内数据的sum(可替换为mean、max等任意聚合函数)。
  • resample('D').last():按天重采样,提取每天最后一个数据点(即当天23:00的滚动计算结果),完全匹配你要求的分组聚合逻辑。

验证:result.loc['2000-01-01']的结果和x['1999-12-31 23:00':'2000-01-01 23:00'].sum()完全一致。


方法二:手动遍历分组(逻辑直观)

如果需要更直观地控制分组过程,可以手动生成每个分组的时间范围,遍历计算:

# 生成所有需要统计的日期(从第一个分组对应的日期到最后一个23:00所在日期)
stats_dates = pd.date_range(start='2000-01-01', end=x.index[-1].date(), freq='D')

# 收集每个分组的聚合结果
agg_results = []
for date in stats_dates:
    # 计算当前分组的起始和结束时间
    start_time = date - pd.Timedelta(days=1) + pd.Timedelta(hours=23)
    end_time = date + pd.Timedelta(hours=23)
    # 提取分组数据并计算sum
    group_sum = x.loc[start_time:end_time].sum()
    # 设置结果的索引为当前统计日期
    group_sum.name = date.date()
    agg_results.append(group_sum)

# 合并结果为DataFrame
result = pd.concat(agg_results, axis=1).T

解释:

  • stats_dates:确定所有需要统计的日期,对应每个分组的“目标日期”(比如第一个分组对应2000-01-01)。
  • 对每个日期,计算分组的时间范围:前一天的23:00到当天的23:00。
  • 提取对应数据并计算聚合,最后合并成结果DataFrame。

内容的提问来源于stack exchange,提问作者guyguyguy12345

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:45:00