时间序列的频率、偏移量
通常,默认生成的时间序列数据是按天计算的,即频率为“D”。“D”是一个基础频率,通过用一个字符串的别名表示,比如“D”是“day”的别名。Pandas中的频率是由一个基础频率和一个乘数组成的,比如,“5D”表示每5天。
接下来,通过一张表来列举时间序列的基础频率,如表1所示。
表1 时间序列的基础频率
别名 | 说明 |
---|---|
D | 每日历日 |
B | 每工作日 |
H | 每小时 |
T或min | 每分 |
S | 每秒 |
L或ms | 每毫秒 |
U | 每微秒 |
M | 每月最后一个日历日 |
BM | 每月最后一个工作日 |
MS | 每月第一个日历日 |
BMS | 每月第一个工作日 |
W-MON、W-TUE… | 从指定的星期几(MON、TUE、WED、THU、FRI、SAT、SUN)开始算起,每周几 |
WOM-1MON、WOM-2MON… | 每月第一周、第二周、第三周或第四周的星期几。 |
Q-JAN、Q-FEB… | 对于以指定月份(JAN、FEB、MAR、APR、MAY、JUN、JUL、AUG、SEP、OCT、NOV、DEC)结束的年度,每季度最后一月的最后一个日历日 |
BQ-JAN、BQ-FEB… | 对于以指定月份结束的年度,每季度最后一月的最后一个工作日 |
QS-JAN、QS- FEB… | 对于以指定月份结束的年度,每季度最后一月的最后一个日历日 |
BQS-JAN、BQS- FEB… | 对于以指定月份结束的年度,每季度最后一月的第一个工作日 |
A-JAN、A- FEB… | 每年指定月份的最后一个日历日 |
BA-JAN、BA- FEB… | 每年指定月份的最后一个工作日 |
AS-JAN、AS- FEB… | 每年指定月份的第一个日历日 |
BAS-JAN、BAS - FEB… | 每年指定月份的第一个工作日 |
为了更好地理解,接下来,通过一个示例来演示如何设置DatetimeIndex对象的频率,示例代码如下。
In [24]: pd.date_range(start='2018/2/1', end='2018/2/28', freq='5D')
Out[24]:
DatetimeIndex(['2018-02-01', '2018-02-06', '2018-02-11', '2018-02-16',
'2018-02-21', '2018-02-26'],
dtype='datetime64[ns]', freq='5D')
上述示例中,创建了一个固定频率的DatetimeIndex对象,该对象的起始日期为2018-02-01,结束日期为2018-02-06,频率为5D,说明每5天采集一次数据。
从输出结果看出,生成的第一个时间戳为2018-02-01,第二个时间戳为2018-02-06,第三个时间戳为2018-02-11......每个时间戳的间隔都是5天。
除此之外,每个基础频率还可以跟着一个被称为日期偏移量的DateOffset对象。如果想要创建一个DateOffset对象,则需要先导入pd.tseries.offsets模块后才行。比如,创建14天10小时的偏移量,具体代码如下。
In [25]: from pandas.tseries.offsets import *
DateOffset(months=4, days=5)
Out[25]: <DateOffset: days=5, months=4>
还可以使用offsets模块中提供的偏移量类型进行创建。例如,创建14天10小时的偏移量,可以换算为两周零十个小时,其中“周”使用Week类型表示的,“小时”使用Hour类型表示,它们之间可以使用加号连接,示例代码如下。
In [26]: Week(2) + Hour(10)
Out[26]: Timedelta('14 days 10:00:00')
上述代码创建了一个Timedelta类对象,该对象用来表示持续时间,两个日期或时间之间的差异。
接下来,通过一个示例来演示如何使用日期偏移量创建DatetimeIndex对象,示例代码如下。
In [27]: # 生成日期偏移量
date_offset = Week(2) + Hour(10)
pd.date_range('2018/3/1', '2018/3/31', freq=date_offset)
Out[27]: DatetimeIndex(['2018-03-01 00:00:00', '2018-03-15 10:00:00',
'2018-03-29 20:00:00'],
dtype='datetime64[ns]', freq='346H')
上述示例中,创建了一个DatetimeIndex对象,它是从2018-03-01 00:00:00开始算起的,到2018-03-31 00:00:00结束,并且每隔14天10小时计算一次
从输出结果可以看出,第一个时间戳为2018-03-01 00:00:00,第二个时间戳为2018-03-15 10:00:00,正好相差了14天10个小时,依此类推。