如何在pandas.DataFrame.resample()中设置低于现有最小TimedeltaIndex的起始值?
问题描述
有一个记录测试中每分钟两个设置值的DataFrame,示例如下:
import pandas as pd df = pd.DataFrame( { "time": [ pd.Timedelta(1, unit="min"), pd.Timedelta(2, unit="min"), pd.Timedelta(3, unit="min"), pd.Timedelta(4, unit="min"), pd.Timedelta(5, unit="min"), ], "setting_1": [4.0, 4.0, 6.0, 6.0, 8.0], "setting_2": [1.0, 2.0, 3.0, 4.0, 5.0], } ).set_index("time")
输出结果:
setting_1 setting_2 time 0 days 00:01:00 4.0 1.0 0 days 00:02:00 4.0 2.0 0 days 00:03:00 6.0 3.0 0 days 00:04:00 6.0 4.0 0 days 00:05:00 8.0 5.0
需要将其与每10秒采样一次的测试结果DataFrame合并,原本使用df.resample("10S").bfill()扩展索引,但该方法索引起始于原数据的最小索引0 days 00:01:00。现希望索引起始于0 days 00:00:10,且该时间段内的设置值用1分钟处的值回填,同时无需拼接临时DataFrame。
更优解决方案
方法1:resample指定start参数
直接在resample中设置start为目标起始时间,结合bfill()自动扩展索引并回填值:
# 指定重采样起始时间为10秒,间隔10秒 resampled_df = df.resample("10S", start=pd.Timedelta("10s")).bfill() resampled_df.head()
输出结果:
setting_1 setting_2 time 0 days 00:00:10 4.0 1.0 0 days 00:00:20 4.0 1.0 0 days 00:00:30 4.0 1.0 0 days 00:00:40 4.0 1.0 0 days 00:00:50 4.0 1.0
原理:start参数强制重采样序列从指定时间开始,bfill()会用原数据中第一个非缺失值(即00:01:00的设置值)填充起始点到原最小索引之间的区间。
方法2:构造目标索引后用reindex回填
手动生成完整的目标时间索引,再通过reindex结合bfill()实现填充:
# 生成从10秒到原数据最大时间的10秒间隔索引 target_index = pd.TimedeltaIndex( pd.date_range(start=pd.Timedelta("10s"), end=df.index.max(), freq="10S").time ) # 重新索引并回填缺失值 resampled_df = df.reindex(target_index).bfill() resampled_df.head()
此方法可精准控制索引范围,适合复杂时间区间的需求。
内容的提问来源于stack exchange,提问作者Braden
相关产品推荐
相关产品推荐

