创建固定频率的时间序列
Pandas中提供了一个date_range()函数,主要用于生成一个具有固定频率的DatetimeIndex对象,该函数的语法格式如下:
pandas.date_range(start = None, end = None, periods = None,freq = None, tz = None,
normalize = False,name = None, closed = None,** kwargs)
部分参数的含义如下:
(1) start:表示起始日期,默认为None。
(2) end:表示终止日期,默认为None。
(3) periods:表示产生多少个时间戳索引值。若设置为None,则start与end必须不能为None。
(4) freq:表示以自然日为单位,这个参数用来指定计时单位,比如’5H’表示每隔5个小时计算一次。
(5) tz:表示时区,比如Asia/Hong_Kong。
(6) normalize:接收布尔值,默认值为False。如果设为True的话,那么在产生时间戳索引值之前,会将start和end都转化为当日的午夜0点。
(7) name:给返回的时间序列索引指定一个名字。
(8) closed:表示start和end这个区间端点是否包含在区间内,可以取值为如下选项:
left:表示左闭右开区间;
right:表示左开右闭区间;
None:表示两边都是闭区间。
需要注意的是,start、end、periods、freq这四个参数至少要指定三个参数,否则会出现错误。
当调用date_range()函数创建DatetimeIndex对象时,如果只是传入了开始日期(start参数)与结束日期(end参数),则默认生成的时间点是按天计算的,即freq参数为D,示例代码如下。
In [17]: # 创建DatetimeIndex对象时,只传入开始日期与结束日期
pd.date_range('2018/08/10', '2018/08/20')
Out[17]:
DatetimeIndex(['2018-08-10', '2018-08-11', '2018-08-12', '2018-08-13',
'2018-08-14', '2018-08-15', '2018-08-16', '2018-08-17',
'2018-08-18', '2018-08-19', '2018-08-20'],
dtype='datetime64[ns]', freq='D')
如果只是传入了开始日期或结束日期,则还需要用periods参数指定产生多少个时间戳,示例代码如下。
In [18]: # 创建DatetimeIndex对象时,传入start与periods参数
pd.date_range(start='2018/08/10', periods=5)
Out[18]:
DatetimeIndex(['2018-08-10', '2018-08-11', '2018-08-12', '2018-08-13',
'2018-08-14'], dtype='datetime64[ns]', freq='D')
In [19]: # 创建DatetimeIndex对象时,传入end与periods参数
pd.date_range(end='2018/08/10', periods=5)
Out[19]:
DatetimeIndex(['2018-08-06', '2018-08-07', '2018-08-08', '2018-08-09',
'2018-08-10'], dtype='datetime64[ns]', freq='D')
由此可知,起始日期与结束日期定义了时间序列索引的严格边界。
如果希望时间序列中的时间戳都是每周固定的星期日,则可以在创建DatetimeIndex时将freq参数设为“W-SUN”。例如,创建一个DatetimeIndex对象,它是从2018年01月01日开始每隔一周连续生成五个星期日的日期,代码如下。
In [20]: dates_index = pd.date_range('2018-01-01', # 起始日期
periods=5, # 周期
freq='W-SUN') # 频率
dates_index
Out[20]:
DatetimeIndex(['2018-01-07', '2018-01-14', '2018-01-21', '2018-01-28',
'2018-02-04'],
dtype='datetime64[ns]', freq='W-SUN')
上述示例中,创建了一个固定频率的DatetimeIndex对象,其中start参数传入的是2018-01-01,说明从2018年1月1日开始算起, periods参数传入的是5,说明会生成5个日期, freq参数传入的是W-SUN,表示按每周日计算一次。
从输出结果可以看出,DatetimeIndex对象的列表中一共有五个日期字符串,第一个字符串表示的日期2018-01-07是2018年的第1个周日,第二个字符串表示的日期2018-01-14是2018年第2个周日,依次类推,每个字符串代表的都是2018年的周日。
例如,创建一个Series对象,将刚创建的dates_index作为该对象的索引,代码如下。
In [21]: ser_data = [12, 56, 89, 99, 31]
pd.Series(ser_data, dates_index)
Out[21]:
2018-01-07 12
2018-01-14 56
2018-01-21 89
2018-01-28 99
2018-02-04 31
Freq: W-SUN, dtype: int64
默认情况下,如果开始日期或起始日期中带有与时间相关的信息(如,12:13),则生成的时间序列中会保留时间信息。不过,从标准来说,每一天是从0点开始的,要想产生一组被规范化到当天午夜(00:00:00)的时间戳,可以将normalize参数的值设为True,示例代码如下。
In [22]: # 创建DatetimeIndex,并指定开始日期、产生日期个数、默认的频率,以及时区
pd.date_range(start='2018/8/1 12:13:30', periods=5, tz='Asia/Hong_Kong')
Out[22]:
DatetimeIndex(['2018-08-01 12:13:30+08:00', '2018-08-02 12:13:30+08:00',
'2018-08-03 12:13:30+08:00', '2018-08-04 12:13:30+08:00',
'2018-08-05 12:13:30+08:00'],
dtype='datetime64[ns, Asia/Hong_Kong]', freq='D')
In [23]: # 规范化时间戳
pd.date_range(start='2018/8/1 12:13:30', periods=5,
normalize=True, tz='Asia/Hong_Kong')
Out[23]:
DatetimeIndex(['2018-08-01 00:00:00+08:00', '2018-08-02 00:00:00+08:00',
'2018-08-03 00:00:00+08:00', '2018-08-04 00:00:00+08:00',
'2018-08-05 00:00:00+08:00'],
dtype='datetime64[ns, Asia/Hong_Kong]', freq='D')
在上述两个示例中,第一个示例中生成的时间戳没有进行规范,它的时间信息为12:13:30,而第二个示例中对生成的时间戳进行了规范,它的时间信息为00:00:00。