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

如何对多对象时间序列的Pandas DataFrame按对象单独重采样?

按ID分组对多对象时间序列重采样的最优实现

要实现每个对象单独重采样,用groupby结合resample是Pandas里最直接且高效的方案——Pandas对分组后的时间序列操作做了专门优化,比手动循环每个ID性能好得多,代码也更简洁。

完整代码示例

先从你的示例数据开始,一步步实现重采样:

import pandas as pd

# 构造原数据帧
data = {
    'ID': [0, 0, 0, 3, 3, 3, 5, 5],
    'Time': [0, 1, 2, 1, 2, 3, 10, 11],
    'Value': [1, 1, 1, 4, 6, 6, 0, 1]
}
df = pd.DataFrame(data)

# 步骤1:将Time列转换为Timedelta类型(适配resample的时间频率识别)
df['Time'] = pd.to_timedelta(df['Time'], unit='s')

# 步骤2:按ID分组,对每个组执行重采样+插值
resampled_df = (
    df.groupby('ID', group_keys=False)
      .apply(lambda group: group.set_index('Time').resample('0.5S').interpolate(method='linear'))
      .reset_index()
)

# 步骤3:将Time转回数值秒数(和原数据格式对齐)
resampled_df['Time'] = resampled_df['Time'].dt.total_seconds()

print(resampled_df)

运行后输出就会和你给出的示例一致,插值部分你可以把interpolate(method='linear')换成自己需要的逻辑(比如ffill()填充前值、bfill()填充后值,或者自定义函数)。

为什么这是最优方案?

  • 分组隔离:groupby('ID')确保每个对象的时间序列完全独立处理,不会出现跨对象的干扰。
  • 性能优化:Pandas的resample是专门为时间序列设计的矢量化操作,比手动遍历每个ID循环处理快几个数量级,尤其是数据量较大时优势明显。
  • 格式友好:通过group_keys=False和reset_index(),最终输出的结构和原数据保持一致,不需要额外处理多级索引。

额外注意事项

  • 如果你的Time列是绝对时间(比如YYYY-MM-DD HH:MM:SS),不需要转换成Timedelta,直接设置为索引后执行resample即可。
  • 若要进一步提升性能,可以尝试用pd.Grouper指定时间维度,但对于大多数场景,上面的写法已经足够简洁高效。

内容的提问来源于stack exchange,提问作者Gemini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:42:03