如何用Pandas resample交替按10/20分钟对时序数据求平均?
解决交替时间间隔求均值的方案
优先使用resample的实现思路:先按最小间隔(10分钟)做全量重采样,再通过分组合并的方式实现交替的10/20分钟均值计算,步骤如下:
- 预处理数据:确保时间列是
datetime类型并设为索引
import pandas as pd import numpy as np # 转换时间列类型并设置为索引 df['time'] = pd.to_datetime(df['time']) df = df.set_index('time')
- 按10分钟间隔重采样:先得到所有10分钟区间的均值
# 按10分钟重采样,计算每个区间的velocity均值 resampled_10min = df.resample('10T').mean().reset_index()
- 生成合并标签:标记哪些10分钟区间需要合并成20分钟区间(实现10→20→10→20的交替)
# 每3个10分钟为一组:第1个单独保留,后2个合并为20分钟 merge_tags = [] current_tag = 0 for idx in range(len(resampled_10min)): merge_tags.append(current_tag) # 每处理完第1、4、7...个10分钟区间(索引0,3,6...),切换到下一个标签 if idx % 3 == 0: current_tag += 1 # 每处理完第3、6、9...个10分钟区间(索引2,5,8...),切换到下一个标签 elif idx % 3 == 2: current_tag += 1 resampled_10min['merge_tag'] = merge_tags
- 按标签分组计算最终均值:
# 按合并标签分组,取每个组的起始时间和velocity均值 final_result = resampled_10min.groupby('merge_tag').agg( time=('time', 'first'), # 取组内第一个10分钟区间的起始时间 velocity=('velocity', 'mean') ).reset_index(drop=True) # 查看结果 print(final_result)
另一种直接分组的方案(无需先resample)
如果数据量极大,也可以直接通过时间偏移计算分组键,避免生成中间的10分钟重采样结果:
df['time'] = pd.to_datetime(df['time']) start_time = df['time'].min() # 计算每个时间点相对于起始时间的总秒数偏移 offsets = (df['time'] - start_time).dt.total_seconds() # 交替块的周期为30分钟(10+20),对应1800秒 cycle_sec = 10*60 + 20*60 # 单个10分钟块的秒数 block_10_sec = 10*60 # 计算分组ID:每个周期内前10分钟为一组,后20分钟为一组 cycle = offsets // cycle_sec in_cycle = offsets % cycle_sec group_id = np.where(in_cycle < block_10_sec, 2*cycle, 2*cycle + 1) # 按分组ID计算均值 final_result = df.groupby(group_id).agg( time=('time', lambda x: start_time + pd.Timedelta(seconds=(x - start_time).dt.total_seconds().min())), velocity=('velocity', 'mean') ).reset_index(drop=True)[['time', 'velocity']]
内容的提问来源于stack exchange,提问作者tornadogal
相关产品推荐
相关产品推荐

