Pandas:如何为含多个非重叠时间序列的长DataFrame补全缺失时间戳?
补全分组时间序列缺失时间戳并转换为3D数组
我来帮你解决这个问题!要给每个id对应的时间序列补全缺失的时间戳,再将结果转换为3D数组,其实有很简洁的Pandas方法可以实现,分两步走:
第一步:补全缺失的时间戳
首先我们需要确定全局的时间范围(也就是所有id覆盖到的最小到最大时间戳),然后对每个id分组后重新索引到这个完整时间序列,自动用NaN填充缺失的price值:
import numpy as np import pandas as pd # 你的原始DataFrame df = pd.DataFrame({'id':[1,1,1,1,1,2,2,2,2,2,2], 't':[0,1,2,3,4,2,3,4,5,6,7], 'price':[10,10.2,10.8,10.1,10.4,142.1,142.8,143.6,142.8,141.4,140.7]}) # 生成完整的时间序列(从全局最小t到最大t) full_time_range = np.arange(df['t'].min(), df['t'].max() + 1) # 分组后重新索引,补全缺失时间戳 df_complete = df.groupby('id').apply( lambda group: group.set_index('t').reindex(full_time_range) ).reset_index() # 调整列名(groupby.apply后会生成多级索引,这里重命名为目标列名) df_complete.columns = ['id', 't', 'price']
运行后得到的df_complete就和你想要的df_target完全一致了。
第二步:转换为3D数组
补全数据后,我们可以通过两种方式将其转换为3D数组(形状为[id数量, 时间戳数量, 特征数量],这里特征是price,所以最后一维是1):
方法一:先转宽表再转数组
# 将数据转为宽表:行是id,列是时间戳t,值是price wide_df = df_complete.pivot(index='id', columns='t', values='price') # 转换为3D数组,添加特征维度 arr_3d = wide_df.values[..., np.newaxis]
方法二:分组后直接堆叠数组
# 按id分组提取price数组,然后堆叠成3D数组 arr_3d = np.stack( [group['price'].to_numpy() for _, group in df_complete.groupby('id')] )[..., np.newaxis]
最终的arr_3d就是你需要的3D数组,打印出来可以看到形状为(2, 8, 1),完美对应两个id、8个时间戳和一个price特征。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

