如何对多对象时间序列的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
相关产品推荐
相关产品推荐

