如何让带timedelta的Pandas Series重采样从0时间间隔开始?
让Pandas带Timedelta索引的Series从0时刻开始重采样
你需要让带Timedelta索引的Series重采样时,以timedelta(seconds=0)作为起始基准,而非默认的首个索引值。以下是实现方法:
问题复现
你的原始代码及输出:
from datetime import timedelta from random import sample import pandas as pd s = pd.Series(1, index=[timedelta(minutes=m) for m in sample(range(1, 100), 10)]) print(s.resample('1h').count())
当前输出:
0 days 00:12:00 9 0 days 01:12:00 1 dtype: int64
期望输出是从0时刻开始的完整小时区间,包括计数为0的区间:
0 days 00:00:00 9 0 days 01:00:00 0 0 days 02:00:00 1 dtype: int64
解决方案
核心是重采样时指定origin参数为pd.Timedelta(0),同时确保保留计数为0的区间:
from datetime import timedelta from random import sample import pandas as pd s = pd.Series(1, index=[timedelta(minutes=m) for m in sample(range(1, 100), 10)]) # 指定起始点为0时刻重采样,再补全所有区间的缺失值 resampled = s.resample('1h', origin=pd.Timedelta(0)).count() # 生成从0到最大索引向上取整的完整时间区间 full_range = pd.timedelta_range(start='0h', end=s.index.max().ceil('1h'), freq='1h') result = resampled.reindex(full_range, fill_value=0) print(result)
代码解释
origin=pd.Timedelta(0):强制重采样的起始基准为0时刻,而非Series中的首个索引值。pd.timedelta_range(...):生成从0时刻到Series最大索引向上取整的完整小时区间,确保所有需要的区间都被包含。reindex(fill_value=0):将重采样结果对齐到完整区间,缺失的区间填充0,符合你的期望输出。
简化写法
如果不需要严格对齐到最大索引的上一个小时,也可以用asfreq快速填充:
result = s.resample('1h', origin=pd.Timedelta(0)).count().asfreq('1h', fill_value=0)
内容的提问来源于stack exchange,提问作者Michael Dorner
相关产品推荐
相关产品推荐

