如何基于时间按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
相关产品推荐
相关产品推荐

