使用Pandas Grouper时如何获取时段结束时间戳
获取Pandas Grouper分组后的时段结束时间
刚好之前处理过类似的需求,用Pandas的Grouper分组后获取时段结束时间其实有两种常用思路,结合你的示例数据给你一步步说明:
第一步:确保时间列是datetime类型
首先得把你的Energy列转换成Pandas的datetime格式,不然分组会出错,代码如下:
import pandas as pd # 构造示例DataFrame(还原你的数据结构) data = { 'week': [1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161], 'Energy': ['2018-01-09 00:00:00', '2018-01-09 00:10:00', '2018-01-09 00:20:00', '2018-01-09 00:30:00', '2018-01-09 00:40:00', '2018-01-09 00:50:00', '2018-01-09 01:00:00', '2018-01-09 01:10:00', '2018-01-09 01:20:00', '2018-01-09 01:30:00'], 'None': ['None']*10, 'Value': [0.0, 0.0, 104.0, 104.04908, 0.0, 0.0, 46.428571, 0.0, 0.0, 113.846154] } df = pd.DataFrame(data) # 转换时间列为datetime类型 df['Energy'] = pd.to_datetime(df['Energy'])
方法一:获取分组内实际的最后一条记录时间戳
如果你的需求是拿到每个分组里实际存在的最晚时间(比如00:00-01:00时段里最后一条数据是00:50,就取这个时间),可以直接用agg方法结合max函数:
# 按小时分组,同时获取时段结束时间(分组内最大的时间戳)和Value的总和 result = df.groupby(pd.Grouper(key='Energy', freq='H')).agg( 时段结束时间=('Energy', 'max'), 总价值=('Value', 'sum') ).reset_index() print(result)
输出结果:
Energy 时段结束时间 总价值 0 2018-01-09 00:00:00 2018-01-09 00:50:00 208.049080 1 2018-01-09 01:00:00 2018-01-09 01:30:00 160.274725
这里的Energy列是分组的起始时间,时段结束时间就是该分组内所有时间戳里的最大值。
方法二:获取严格的时段边界结束时间
如果需要的是理论上的时段结束时间(比如00:00-01:00时段的结束时间是01:00:00,不管有没有这个时间点的数据),可以通过分组起始时间加上分组频率的时长来计算:
# 先按小时分组计算Value的总和 result = df.groupby(pd.Grouper(key='Energy', freq='H'))['Value'].sum().reset_index() # 计算严格的时段结束时间:起始时间 + 1小时 result['严格时段结束时间'] = result['Energy'] + pd.Timedelta(hours=1) print(result)
输出结果:
Energy 总价值 严格时段结束时间 0 2018-01-09 00:00:00 208.049080 2018-01-09 01:00:00 1 2018-01-09 01:00:00 160.274725 2018-01-09 02:00:00
如果你的分组频率不是小时(比如30分钟),只需要把pd.Timedelta(hours=1)改成对应的时长即可,比如pd.Timedelta(minutes=30)。
内容的提问来源于stack exchange,提问作者Antimony
相关产品推荐
相关产品推荐

