pandas时间序列常用方法简介
导读
pandas是Python数据分析最好用的第三方库,没有之一。——笛卡儿没说过这句话!
在进行时间相关的数据分析时,时间序列的处理是自然而然的事情,从创建、格式转换到筛选、重采样和聚合统计,pandas都提供了全套方法支持,用的熟练简直是异常丝滑。
pandas时间序列创建最为常用的有以下2种方式:
pd.date_range(),创建指定日期范围,start、end和periods三个参数任意指定2个即可,另有频率、开闭端点、时区等参数可选
pd.Timestamp(),时间戳对象,从其首字母大写的命名方式可以看出这是pandas中的一个类,实际上相当于Python标准库中的datetime的定位,在创建时间对象时可接受日期字符串、时间戳数值或分别指定年月日时分秒等参数三类,仅能生成单一时间点。其优点是Timestamp类提供了丰富的时间处理接口,如日期加减、属性提取等
与二者类似,pandas还提供了pd.period和pd.period_range两个方法,分别用于创建单个时期和时期序列。这里时期是一段时间,而date或timestamp则是一个时间点。
实际应用中,与时间格式相互转换最多的应该就是字符串格式了,这也是最为常用也最为经典的时间转换需求,pandas中自然也带有这一功能:
pd.to_datetime:字符串转时间格式
dt.astype(str):时间提取字符串
其中,pd.to_datetime可接受单个或多个日期数值,具体类型包括数值型、字符串、数组或pd.series等序列,其中字符串日期格式几乎包含了所有可能的组成形式,例如"年/月/日","月/日/年"和"月-日-年"等形式,字符串转换日期也是实际应用中最为常见的需求。反之,对于日期格式转换为相应的字符串形式,pandas则提供了时间格式的"dt"属性,类似于pandas为字符串类型提供了str属性及相应方法,时间格式的"dt"属性也支持大量丰富的接口。例如dt.date可提取日期,dt.time则可提取时间。
需要指出,时间序列在pandas.dataframe数据结构中,当该时间序列是索引时,则可直接调用相应的属性;若该时间序列是dataframe中的一列时,则需先调用dt属性再调用接口。举例如下:
1.首先创建数据结构如下,其中初始dataframe索引是时间序列,两列数据分别为数值型和字符串型
处理时间序列的另一个常用需求是筛选指定范围的数据,例如选取特定时段、特定日期等。实现这一目的,个人较为常用的有3种方法:
索引模糊匹配,这实际上算是pandas索引访问的一个通用策略,所以自然在时间筛选中也适用
truncate,截断函数,通过接受before和after参数,实现筛选特定范围内的数据,其中两个参数中可有一个缺省,表示半开区间
dt.between,也是借助时间序列的dt属性,接受起始和结束参数,实现特定范围筛选
以这一数据作为示例,其中索引时间序列,需求是筛选出上午7点-9点间的记录,则3种实现方式分别示例如下:
关于pandas时间序列的重采样,再补充两点:1.重采样函数可以和groupby分组聚合函数组合使用,可实现更为精细的功能,具体可参考Pandas中groupby的这些用法你都知道吗一文;2.重采样过程中,无论是上采样还是下采样,其采样结果范围是输入记录中的最小值和最大值覆盖的范围,所以当输入序列中为两段不连续的时间序列记录时,可能会出现中间大量不需要的结果(笔者亲历天坑),同时在上图中也可发现从4小时上采样为2小时后时间最大范围是20:00,而非22:00,也是这个原因。
理解pandas中时间序列滑动窗口的最好方式是类比SQL中的窗口函数。实际上,其与分组聚合函数的联系和SQL中的窗口函数与分组聚合联系是一致的。常用的滑动窗口函数主要有3个:
shift,向前或向后取值
diff,向前或向后去差值
rolling,一段滑动窗口内聚合取值
值得指出,这里的滑动取值可以这样理解:periods参数为正数时,可以想象成索引列不动,数据列向后滑动;反之,periods参数为负数时,索引列不动,数据列向前滑动。进一步的,当freq参数为None时,则仅仅是滑动指定数目的记录,而不管索引实际取值;而当freq设置有效参数时,此时要求索引列必须为时间序列,并根据时间序列滑动到指定周期处,并从此处开始取值(在上图中,体现为10T之前的记录不再保留)。
相关阅读: