如何用Pandas将10分钟时间序列转15分钟?含重采样与缺失值方案
针对你的时间序列转换需求,以下是具体解决方案:
一、重采样是正确且高效的方法
将10分钟间隔序列转换为15分钟步长,Pandas的resample是标准解决方案,它能直接按时间区间聚合数据,适配绝大多数时序转换场景。
实现步骤:
首先将你的数据整理为Pandas时间序列结构:
import pandas as pd time = [pd.Timestamp('2021-01-01 05:30:00'), pd.Timestamp('2021-01-01 05:40:00'), pd.Timestamp('2021-01-01 05:50:00'), pd.Timestamp('2021-01-01 06:00:00'), pd.Timestamp('2021-01-01 06:10:00'), pd.Timestamp('2021-01-01 06:20:00'), pd.Timestamp('2021-01-01 06:30:00'), pd.Timestamp('2021-01-01 06:40:00'), pd.Timestamp('2021-01-01 06:50:00'), pd.Timestamp('2021-01-01 07:00:00')] value = [4.84,6.92,7.99,8.01,7.07,5.11,7.1,7.03,7.02,8.07] df = pd.DataFrame({'value': value}, index=time)
然后通过resample指定15分钟步长('15T'),结合聚合函数生成目标序列:
# 按15分钟区间取均值(最常用) df_resampled_mean = df.resample('15T').mean() # 其他可选聚合逻辑:取区间第一个值/最后一个值/求和 df_resampled_first = df.resample('15T').first() df_resampled_last = df.resample('15T').last() df_resampled_sum = df.resample('15T').sum()
二、其他替代方法
如果重采样的聚合逻辑不符合你的需求,还可以选择以下两种方案:
1. 时间插值法
适合需要平滑连续值的场景(比如传感器读数),先对齐15分钟时间轴,再用插值填充缺失值:
# 生成15分钟间隔的目标时间轴 new_index = pd.date_range(start=df.index.min(), end=df.index.max(), freq='15T') # 重新索引,缺失位置设为NaN df_reindexed = df.reindex(new_index) # 时间加权插值(比线性插值更贴合时序特性) df_interpolated = df_reindexed.interpolate(method='time')
2. 手动区间映射聚合
适合需要自定义区间逻辑的场景,通过pd.cut划分时间区间后再分组聚合:
# 生成15分钟的区间标签 df['time_bin'] = pd.cut(df.index, bins=pd.date_range(start=df.index.min(), end=df.index.max()+pd.Timedelta(minutes=15), freq='15T')) # 按区间分组计算均值 df_grouped = df.groupby('time_bin')['value'].mean()
三、缺失数据的处理
缺失数据的处理需结合业务场景选择:
- 前后填充:缺失段较短时,用前一个/后一个有效值填充:
df.resample('15T').ffill() # 向前填充 df.resample('15T').bfill() # 向后填充 - 插值填充:连续型时序数据优先用时间加权插值,保证数值平滑性:
df_reindexed.interpolate(method='time') - 全局值填充:用全局均值/中位数填充无规律的缺失值:
df_resampled = df.resample('15T').mean() df_resampled.fillna(df['value'].mean(), inplace=True) - 删除缺失段:如果缺失区间无业务价值,直接删除:
df_resampled.dropna(inplace=True)
内容的提问来源于stack exchange,提问作者Ganesh M
相关产品推荐
相关产品推荐

