本文示例代码及文件已上传至个人
Github
仓库https://github.com/CNFeffery/DataScienceStudyNotesgit
咱们在使用pandas
分析处理时间序列数据时,常常须要对原始时间粒度下的数据,按照不一样的时间粒度进行分组聚合运算,譬如基于每一个交易日的股票收盘价,计算每月的最低和最高收盘价。github
而在pandas
中,针对不一样的应用场景,咱们可使用resample()
、groupby()
以及Grouper()
来很是高效快捷地完成此类任务。app
在pandas
中根据具体任务场景的不一样,对时间序列进行分组聚合可经过如下两类方式实现:code
resample
原始的意思是重采样,可分为上采样与下采样,而咱们一般状况下使用的都是下采样,也就是从高频的数据中按照必定规则计算出更低频的数据,就像咱们一开始说的对每日数据按月汇总那样。orm
若是你熟悉pandas
中的groupby()
分组运算,那么你就能够很快地理解resample()
的使用方式,它本质上就是在对时间序列数据进行“分组”,最基础的参数为rule
,用于设置按照何种方式进行重采样,就像下面的例子那样:blog
import pandas as pd # 记录了2013-02-08到2018-02-07之间每一个交易日苹果公司的股价 AAPL = pd.read_csv('AAPL.csv', parse_dates=['date']) # 以月为统计窗口计算每个月股票最高收盘价 ( AAPL .set_index('date') # 设置date为index .resample('M') # 以月为单位 .agg({ 'close': ['max', 'min'] }) )
能够看到,在上面的例子中,咱们对index为日期时间类型的DataFrame
应用resample()
方法,传入的参数'M'
是resample
第一个位置上的参数rule
,用于肯定时间窗口的规则,譬如这里的字符串'M'
就表明月且聚合结果中显示对应月的最后一天,经常使用的固化的时间窗口规则以下表所示:ci
规则 | 说明 |
---|---|
W | 星期 |
M | 月,显示为当月最后一天 |
MS | 月,显示为当月第一天 |
Q | 季度,显示为当季最后一天 |
QS | 季度,显示为当季第一天 |
A | 年,显示为当年最后一天 |
AS | 年,显示为当年第一天 |
D | 日 |
H | 小时T |
T或min | 分钟 |
S | 秒 |
L或 ms | 毫秒 |
且这些规则均可以在前面添加数字实现倍数效果:字符串
# 以6个月为统计窗口计算每个月股票平均收盘价且显示为当月第一天 ( AAPL .set_index('date') # 设置date为index .resample('6MS') # 以6个月为单位 .agg({ 'close': 'mean' }) )
且resample()
很是贴心之处在于它会自动帮你对齐到规整的时间单位上,譬如咱们这里只有交易日才会有记录,若是咱们设置的时间单位下无对应记录,也会为你保留带有缺失值记录的时间点:get
( AAPL .set_index('date') # 设置date为index .resample('1D') # 以1日为单位 .agg({ 'close': 'mean' }) )
而经过参数closed
咱们能够为细粒度的时间单位设置区间闭合方式,譬如咱们以2日为单位,将closed
设置为'right'
时,从第一行记录开始计算所落入的时间窗口时,其对应为时间窗口的右边界,从而影响后续全部时间单元的划分方式:pandas
( AAPL .set_index('date') # 设置date为index .resample('2D', closed='right') .agg({ 'close': 'mean' }) )
而即便你的数据框index
不是日期时间类型,也可使用参数on
来传入日期时间列名实现一样的效果。
有些状况下,咱们不单单须要利用时间类型列来分组,也可能须要包含时间类型在内的多个列共同进行分组,这种状况下咱们就可使用到Grouper()
。
它经过参数freq
传入等价于resample()
中rule
的参数,并利用参数key
指定对应的时间类型列名称,可是能够帮助咱们建立分组规则后传入groupby()
中:
# 分别对苹果与微软每个月平均收盘价进行统计 ( pd .read_csv('AAPL&MSFT.csv', parse_dates=['date']) .groupby(['Name', pd.Grouper(freq='MS', key='date')]) .agg({ 'close': 'mean' }) )
且在此种混合分组模式下,咱们能够很是方便的配合apply
、transform
等操做,这里就再也不赘述。
以上就是本文的所有内容,欢迎在评论区与我进行讨论~