如何对含前一日末小时的日度重叠分组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
相关产品推荐
相关产品推荐

