如何使用Pandas将15分钟间隔的发电机发电数据转换为小时级平均值数据
解决15分钟间隔数据转小时级均值的问题
刚好你提到的用Pandas处理这个需求非常合适,我推荐用resample方法(专门针对时间序列的重采样工具),比groupby更直观且适配时间场景,下面一步步给你演示:
步骤1:准备数据并处理时间格式
首先我们把你的示例数据导入Pandas,并且将Time列转换成datetime类型(这是时间序列处理的基础):
import pandas as pd # 你的示例数据 data = { 'Time': ['00:15:00', '00:30:00', '00:45:00', '01:00:00', '01:15:00', '01:30:00', '01:45:00', '02:00:00'], 'Gen1': [10, 12, 16, 20, 60, 30, 70, 40], 'Gen2': [21, 22, 26, 11, 51, 31, 21, 61] } df = pd.DataFrame(data) # 将Time列转为datetime格式 df['Time'] = pd.to_datetime(df['Time'], format='%H:%M:%S')
步骤2:用resample生成小时级均值
这里关键是用resample('H')按小时分组,再加上label='right'参数——这个参数会让每个分组的标签用区间的结束时间(比如00:15-01:00的区间,标签显示为01:00:00),正好匹配你的预期输出:
# 设置Time列为索引,方便resample操作 df = df.set_index('Time') # 按小时重采样,取均值,并用区间右边界作为时间标签 hourly_avg = df.resample('H', label='right').mean() # 重置索引,并把时间格式转回HH:MM:SS的字符串 hourly_avg = hourly_avg.reset_index() hourly_avg['Time'] = hourly_avg['Time'].dt.strftime('%H:%M:%S')
步骤3:查看结果
运行完上面的代码后,打印hourly_avg就能得到你想要的结果:
print(hourly_avg)
输出结果:
Time Gen1 Gen2 0 01:00:00 14.5 20.0 1 02:00:00 50.0 41.0
补充:用groupby的实现方式(备选)
如果你一定要用groupby的话,可以提取每个时间对应的结束小时,再分组求均值:
# 回到原始的df(未设置索引的版本) df['end_hour'] = df['Time'].dt.hour + 1 # 计算每个15分钟区间所属的结束小时 hourly_avg_groupby = df.groupby('end_hour').mean().reset_index() # 格式化时间列 hourly_avg_groupby['Time'] = hourly_avg_groupby['end_hour'].apply(lambda x: f"{x:02d}:00:00") # 调整列顺序,匹配预期输出 hourly_avg_groupby = hourly_avg_groupby[['Time', 'Gen1', 'Gen2']]
不过这种方式在数据跨天的时候会有问题(比如23:15的结束小时是0,需要额外处理日期),所以还是更推荐resample的方案。
内容的提问来源于stack exchange,提问作者Vesper
相关产品推荐
相关产品推荐

