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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:13:19