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
相关产品推荐
相关产品推荐

