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

Python:如何按时间间隔对DataFrame进行分组聚合

按4小时间隔分组求和datetime.time索引的DataFrame

这里有两种实用的方法来实现你需要的分组求和需求,针对以datetime.time对象为索引的DataFrame:

方法1:利用小时数整数除法分组

这种方法通过提取索引的小时数,用整数除法快速划分4小时组,逻辑简单直接:

import pandas as pd
from datetime import time

# 先构造你的示例DataFrame(如果已有数据可跳过这部分)
times = [time(h) for h in range(12)]
trips = [10]*4 + [20]*4 + [30]*4
sum_by_time = pd.DataFrame({'Trips': trips}, index=times)

# 核心处理步骤
# 1. 提取每个索引时间的小时数,按每4小时一组划分
group_keys = sum_by_time.index.hour // 4
# 2. 分组求和
result = sum_by_time.groupby(group_keys).sum()
# 3. 自定义索引为你需要的时间范围格式
result.index = [f"{str(time(i*4)).zfill(8)} - {str(time(i*4+3)).zfill(8)}" for i in result.index]

print(result)

解释:

  • sum_by_time.index.hour 会提取每个时间索引的小时数值(比如00:00:00对应0,04:00:00对应4)
  • //4 整数除法会将0-3小时归为一组(键0),4-7小时归为一组(键1),8-11小时归为一组(键2)
  • 最后通过列表推导式,把分组键替换成你需要的HH:MM:SS - HH:MM:SS格式的字符串

方法2:使用pd.cut区间分组

如果你更倾向于用区间明确划分分组范围,可以用pd.cut实现:

import pandas as pd
from datetime import time

# 构造示例DataFrame(同上,已有数据可跳过)
times = [time(h) for h in range(12)]
trips = [10]*4 + [20]*4 + [30]*4
sum_by_time = pd.DataFrame({'Trips': trips}, index=times)

# 核心处理步骤
# 1. 定义4小时间隔的区间(0-4, 4-8, 8-12)
time_bins = pd.interval_range(start=0, end=12, freq='4H')
# 2. 将每个时间的小时数映射到对应的区间
group_labels = pd.cut(sum_by_time.index.hour, bins=time_bins)
# 3. 分组求和
result = sum_by_time.groupby(group_labels).sum()
# 4. 格式化索引为目标时间范围
result.index = [f"{str(time(interval.left)).zfill(8)} - {str(time(interval.right-1)).zfill(8)}" for interval in result.index]

print(result)

解释:

  • pd.interval_range 创建了三个左闭右开的区间:[0,4), [4,8), [8,12)
  • pd.cut 把每个小时数分配到对应的区间,作为分组依据
  • 最后把区间对象转换为你需要的时间范围字符串(interval.right-1是因为区间到4,但我们的结束时间是3)

两种方法运行后都会得到你想要的结果:

Trips
00:00:00 - 03:00:00     40
04:00:00 - 07:00:00     80
08:00:00 - 11:00:00    120

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:21:06