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

如何基于时间按5分钟间隔计算列数值平均值?求高效方案

高效实现按5分钟时间间隔计算平均值

问题背景

需要基于时间维度按5分钟间隔计算数值列的平均值,数据采样间隔可能是30秒或1分钟。现有代码仅能处理1分钟采样的情况(按行号每5行分组),无法适配实际时间维度,且循环拼接数据框的方式在处理大量数据时延迟严重,需更高效的实现方案。

现有低效代码:

Planilha = pd.DataFrame({
    'Data/hora': ['01/02/2024 05:01','01/02/2024 05:02','01/02/2024 05:03','01/02/2024 05:04','01/02/2024 05:05','01/02/2024 05:06','01/02/2024 05:07','01/02/2024 05:08','01/02/2024 05:09','01/02/2024 05:10','01/02/2024 05:11','01/02/2024 05:12','01/02/2024 05:13','01/02/2024 05:14','01/02/2024 05:15'],
    'Valores_ok' : [21.48544006,32.41119499,44.18326492,59.37920151,76.55416718,93.16954193,121.0470154,164.0023529,207.9371277,198.1840485,150.4580994,144.5747345,155.5020691,155.5775085,160.8874695],
})

Irrad = Planilha.iloc[:,Planilha.columns.str.contains('Valores')] #Filtering the necessary data

IrradM = pd.DataFrame()
IrradM.columns = pd.DataFrame(columns=Irrad.columns)

for i in range(0, len(Irrad), 5):
    Irrad5m = Irrad.iloc[i:i+5].mean(numeric_only=True)
    Irrad5m = pd.DataFrame(Irrad5m).T
    IrradM = pd.concat([IrradM, Irrad5m], ignore_index=True)

输入数据:

Data/hora  Valores_ok
01/02/2024 05:01   21.485440
01/02/2024 05:02   32.411195
01/02/2024 05:03   44.183265
01/02/2024 05:04   59.379202
01/02/2024 05:05   76.554167
01/02/2024 05:06   93.169542
01/02/2024 05:07  121.047015
01/02/2024 05:08  164.002353
01/02/2024 05:09  207.937128
01/02/2024 05:10  198.184048
01/02/2024 05:11  150.458099
01/02/2024 05:12  144.574735
01/02/2024 05:13  155.502069
01/02/2024 05:14  155.577508
01/02/2024 05:15  160.887470

期望输出:

Data/hora  Valores_ok
01/02/2024 05:05   46.802654
01/02/2024 05:10  156.868017
01/02/2024 05:15  153.399976

高效解决方案

使用Pandas内置的resample方法,这是专门为时间序列聚合设计的高效工具,能精准基于时间维度分组,同时处理不同采样间隔的数据,且性能远高于循环拼接。

实现代码

import pandas as pd

# 1. 读取/创建数据框
Planilha = pd.DataFrame({
    'Data/hora': ['01/02/2024 05:01','01/02/2024 05:02','01/02/2024 05:03','01/02/2024 05:04','01/02/2024 05:05','01/02/2024 05:06','01/02/2024 05:07','01/02/2024 05:08','01/02/2024 05:09','01/02/2024 05:10','01/02/2024 05:11','01/02/2024 05:12','01/02/2024 05:13','01/02/2024 05:14','01/02/2024 05:15'],
    'Valores_ok' : [21.48544006,32.41119499,44.18326492,59.37920151,76.55416718,93.16954193,121.0470154,164.0023529,207.9371277,198.1840485,150.4580994,144.5747345,155.5020691,155.5775085,160.8874695],
})

# 2. 转换时间列为datetime类型,并设置为索引
Planilha['Data/hora'] = pd.to_datetime(Planilha['Data/hora'], dayfirst=True)
Planilha = Planilha.set_index('Data/hora')

# 3. 按5分钟间隔重采样,取窗口结束时间作为标签,计算平均值
result = Planilha.resample('5min', label='right').mean(numeric_only=True)

# 4. 重置索引,格式化时间列为原格式
result = result.reset_index()
result['Data/hora'] = result['Data/hora'].dt.strftime('%d/%m/%Y %H:%M')

print(result)

代码说明

  • pd.to_datetime(..., dayfirst=True):确保日期解析正确(适配日/月/年的输入格式)
  • resample('5min', label='right'):按5分钟时间窗口分组,label='right'指定用窗口的结束时间作为结果的时间标签(比如05:01-05:05的窗口,标签为05:05,匹配期望输出)
  • mean(numeric_only=True):仅对数值列计算平均值,避免非数值列干扰
  • 最后格式化时间列为原字符串格式,保持输出一致性

输出结果

Data/hora  Valores_ok
0  01/02/2024 05:05   46.802654
1  01/02/2024 05:10  156.868017
2  01/02/2024 05:15  153.399976

完全匹配期望输出,且处理大数据时效率远超循环方案。


内容的提问来源于stack exchange,提问作者Matheus.HMM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:07:04