6. resample 和频率转换
Series/DataFrame
有一个shift()
方法用于执行单纯的前移或者后移操作,:Series/DataFrame.shift(periods=1, freq=None, axis=0)
periods
:一个整数(可以为负的),指定移动的数量。对于时间序列,单位由freq
指定。freq
:一个DateOffset/timedelta
或者一个频率字符串。指定移动的单位。注意,如果为PeriodIndex
,则freq
必须和它匹配。axis
:为0/'index'
表示沿着0轴移动;为1/'columns'
表示沿着1轴移动
如果为时间序列,则该方法移动并建立一个新的索引,但是
Series/DataFrame
的值不变。对于非时间序列,则保持索引不变,而移动Series/DataFrame
的值。本质上,时间序列和非时间序列都是
index_i-->value_i
转换成index_i+n-->value_i
。只是时间序列截取的都是有效值,非时间序列截取了NaN
而已。重采样
resampling
指的是将时间序列从一个频率转换到另一个频率的处理过程。- 将高频数据转换到低频数据称作降采样。降采样时,待聚合的数据不必拥有固定的频率,期望的频率(低频的)会自动划分聚合的
bin
的边界。这些bin
将时间序列拆分为多个片段。这些片段都是半开放的,一个数据点只能属于一个片段,所有的片段的并集组成了整个时间帧。在对数据降采样时,只需要考虑两样: - 各个区间哪边是闭合的
- 如何标记各个聚合
bin
,用区间的开头还是结尾 - 将低频数据转换到高频数据称作升采样。将数据转换到高频时,就不需要聚合了,而是插值,默认引入缺失值。插值的填充和填充方式与
fillna/reindex
的一样。 - 在对时间段
Period
进行重采样时,升采样稍微麻烦点,因为你必须决定:哪个高频区间代表原区间。就像asfreq
一样,convention
可以设置为'end'/'start'
有些重采样并不划分到上述两者之中。比如将
W-WED
(每周三)转换到W-FRI
(每周五)。另外,由于Period
是时间区间,所以升采样和降采样的规则就比较严格:- 降采样中,目标频率必须包含原频率。如
Day->Month
,目标频率为每月,原频率为每天。 - 升采样中,原频率必须包含目标频率。如
Day->Hour
,目标频率为每小时,原频率为每天。
如果不满足这些条件,则会引发异常。
- 将高频数据转换到低频数据称作降采样。降采样时,待聚合的数据不必拥有固定的频率,期望的频率(低频的)会自动划分聚合的
resample
方法:Series/DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None,
label=None, convention='start', kind=None, loffset=None, limit=None,
base=0, on=None, level=None)
rule
:一个字符串,指定了重采样的目标频率axis
:为0/'index'
表示沿着0轴重采样;为1/'columns'
表示沿着1轴重采样closed
:一个字符串,指定降采样中,各时间段的哪一端是闭合的。如果为'right'
,则是左开右闭区间;如果为'left'
,则是左闭右开区间label
:在降采样中,如何设置聚合值的标签。可以为'right'/'left'
(面元的右边界或者左边界)。如:9:30~9:35
这5分钟会被标记为9:30
或者9:35
how
:用于产生聚合值的函数名或者数组函数。可以为'mean'/'ohlc'/np.max
等。默认为'mean'
,其他常用的有:'first'/'last'/'median'/'ohlc'/'max'/'min'
。how
被废弃了,而是采用.resample().mean()
这种方案。convention
:当重采样时期时,将低频转换到高频所采用的约定。可以为's'/'start'
(用第一个高频)或者'e'/'end'
(用最后一个高频)loffset
:一个timedelta
,用于调整面元(bin
)标签。如'-1s'
,会将用于将聚合的结果标签调早1秒,从而更容易表示它代表哪个区间。比如12:00:00
你就难以判别是哪个区间,而11:59:59
就很容易知道它是那个区间。你也可以对调用结果对象使用
.shift()
方法来实现该目的,这样就不必设置loffset
了base
:一个整数,默认为0.用于聚合过程中,当频率可以整除1D
(比如4H
)时,第一个完整的分组从哪个元素开始的。如rule='4H'
,base=2
,则Series[0:1]
作为一个分组,Series[2:6]....
作为一个分组….on
:一个字符串,对于DataFrame
,它指定了重采样的列。该列必须是datetime-like
level
:一个字符串或者整数。对于MultiIndex
,该参数指定了被重采样的子索引fill_method
:一个字符串,指定升采样时,如何插值。如'ffill'/'bfill'
。默认不插值该参数被废弃。推荐使用
.resample().ffill()
这种方案。而limit
作为ffill()
的参数。limit
:一个整数。指定向前或者向后填充时,运行连续填充的最大单元数量kind
:一个字符串,指定聚合到时间段Period
还是时间戳Timestamp
。默认聚合到时间序列的索引类型
OHLC
重采样是计算bin
中的四个值:开盘值(第一个值)、收盘值(最后一个值)、最高值(最大值)、最低值(最小值)另一种降采样的办法是:使用
groupby
功能。如:series.groupby(lambda x:x.month).mean()
如果你想根据年份来聚合,则使用
x.year
。