重新采样是指将时间序列从一个频率转换为另一个频率的过程。将更高频率的数据聚合到低频率被称为向下采样,而从低频率转换到高频率称为向上采样。并不是所有的重新采样都属于上面说的两类;例如,将W-WED(weekly on Wednesday,每周三)转换到W-FRI(每周五)既不是向上采样也不是向下采样。
pandas对象都配有resample方法,该方法是所有频率转换的工具函数。resample拥有类似于groupby的API;调用resample对数据分组,之后再调用聚合函数:
resample是一个灵活且高性能的方法,可以用于处理大型时间序列。下表总结了resample方法的部分选项。
将数据聚合到一个规则的低频率上是一个常见的时间序列任务。要聚合的数据不必是固定频率的。期望的频率定义了用于对时间序列切片以聚合的箱体边界。例如,要将时间转换为每月,’M’或’BM’,你需要将数据分成一个月的时间间隔。每个间隔是半闭合的,一个数据点只能属于一个时间间隔,时间间隔的并集必须是整个时间帧。在使用resample进行向下采样数据时有些事情需要考虑:
假设想通过计算每一组的加和将这些数据聚合到五分钟的块或柱内:
传递的频率按五分钟的增量定义了箱体边界。默认情况下,左箱体边界是包含的,因此00:00的值是包含在00:00到00:05间隔内的。传递closed=’right’将间隔的闭合端改为了右边:
产生的时间序列按照每个箱体左边的时间戳被标记。传递label=’right’可以使用右箱体边界标记时间序列:
最后,可能需要将结果索引移动一定的数量,例如从右边缘减去一秒,以使其更清楚地表明时间戳所指的间隔。要实现这个功能,向loffset传递字符串或日期偏置:
在金融中,为每个数据桶计算四个值是一种流行的时间序列聚合方法:第一个值(开端)、最后一个值(结束)、最大值(峰值)和最小值(谷值)。通过使用ohlc聚合函数将会获得包含四种聚合值列的DataFrame,这些值在数据的单次扫描中被高效计算:
当从低频率转换为高频率时,并不需要任何聚合。考虑带有每周数据的DataFrame:
当对这些数据使用聚合函数时,每一组只有一个值,并且会在间隙中产生缺失值。使用asfreq方法在不聚合的情况下转换到高频率:
可以同样选择仅向前填充一定数量的区间,以限制继续使用观测值的时距:
对以区间为索引的数据进行采样与时间戳的情况类似:
向上采样更为细致,因为必须在重新采样前决定新频率中在时间段的哪一端放置数值,就像asfreq方法一样。convention参数默认值是’start’,但也可以是’end’:
由于区间涉及时间范围,向上采样和向下采样就更为严格: