type
status
date
slug
summary
tags
category
icon
password
Property
时间序列(time series)数据是一种重要的结构化数据形式,在多个时间点观察或测量到的任何时间都可以形成一段时间序列。很多时间, 时间序列是固定频率的, 也就是说, 数据点是根据某种规律定期出现的(比如每15秒);时间序列也可以是不定期的。
时间序列数据的意义取决于具体的应用场景,主要由以下几种:
- 时间戳(timestamp),特定的时刻
- 固定时期(period),如2007年1月或2010年全年
- 时间间隔(interval),由起始和结束时间戳表示,时期(period)可以被看做间隔(interval)的特例
时间和日期数据类型及其工具
Python标准库包含用于日期(date)和时间(time)数据的数据类型,而且还有日历方面的功能。主要会用到
datetime
、time
以及calendar
模块。datetime.datetime
(也可以简写为datetime
)是用得最多的数据类型:datetime
以毫秒形式存储日期和时间,timedelta
表示两个datetime
对象之间的时间差:可以给
datetime
对象加上(或减去)一个或多个timedelta
,会产生一个新对象:字符串和datetime的相互转换
利用
str
或strftime
方法(传入一个格式化字符串),datetime
对象和pandas
的Timestamp
对象可以被格式化为字符串:datetime.strptime
可以用这些格式化编码将字符串转换为日期:datetime.strptime
是通过已知格式进行日期解析的最佳方式。但是每次都要编写格式定义是很麻烦的事情,尤其是对于一些常见的日期格式。这种情况下,可以用dateutil这个第三方包中的parser.parse
方法(pandas中已经自动安装好了):pandas通常是用于处理成组日期的,不管这些日期是DataFrame的轴索引还是列。
to_datetime
方法可以解析多种不同的日期表示形式。对标准日期格式(如ISO8601)的解析非常快:时间序列基础
pandas最基本的时间序列类型就是以时间戳(通常以Python字符串或datatime对象表示)为索引的Series:
索引、选取、子集构造
根据标签索引选取数据时,时间序列和其它的
pandas.Series
很像:还有一种更为方便的用法:传入一个可以被解释为日期的字符串:
带有重复索引的时间序列
日期的范围、频率以及移动
pandas中的原生时间序列一般被认为是不规则的,也就是说,它们没有固定的频率。对于大部分应用程序而言,这是无所谓的。但是,它常常需要以某种相对固定的频率进行分析,比如每日、每月、每15分钟等(这样自然会在时间序列中引入缺失值)。
幸运的是,pandas有一整套标准时间序列频率以及用于重采样、频率推断、生成固定频率日期范围的工具。例如可以将之前那个时间序列转换为一个具有固定频率(每日)的时间序列,只需调用resample即可:
字符串“D”是每天的意思。
生成日期范围
pandas.date_range
可用于根据指定的频率生成指定长度的DatetimeIndex
:默认情况下,
date_range
会产生按天计算的时间点。如果只传入起始或结束日期,那就还得传入一个表示一段时间的数字:起始和结束日期定义了日期索引的严格边界。例如,如果想要生成一个由每月最后一个工作日组成的日期索引,可以传入"BM"频率(business end of month),这样就只会包含时间间隔内(或刚好在边界上的)符合频率要求的日期:
重采样及频率转换
重采样(resampling)指的是将时间序列从一个频率转换到另一个频率的处理过程。将高频率数据聚合到低频率称为降采样(downsampling),而将低频率数据转换到高频率则称为升采样(upsampling)。
并不是所有的重采样都能被划分到这两个大类中。例如,将W-WED(每周三)转换为W-FRI既不是降采样也不是升采样。
pandas对象都带有一个
resample
方法,它是各种频率转换工作的主力函数。resample
有一个类似于groupby
的API,调用resample
可以分组数据,然后会调用一个聚合函数:resample
是一个灵活高效的方法,可用于处理非常大的时间序列