第9章 时序数据
import pandas as pd
import numpy as np
一、时序的创建
1. 四类时间变量
现在理解可能关于③和④有些困惑,后面会作出一些说明
名称
描述
元素类型
创建方式
① Date times(时间点/时刻)
描述特定日期或时间点
Timestamp
to_datetime或date_range
② Time spans(时间段/时期)
由时间点定义的一段时期
Period
Period或period_range
③ Date offsets(相对时间差)
一段时间的相对大小(与夏/冬令时无关)
DateOffset
DateOffset
④ Time deltas(绝对时间差)
一段时间的绝对大小(与夏/冬令时有关)
Timedelta
to_timedelta或timedelta_range
2. 时间点的创建
(a)to_datetime方法
Pandas在时间点建立的输入格式规定上给了很大的自由度,下面的语句都能正确建立同一时间点
pd. to_datetime( '2020.1.1' )
pd. to_datetime( '2020 1.1' )
pd. to_datetime( '2020 1 1' )
pd. to_datetime( '2020 1-1' )
pd. to_datetime( '2020-1 1' )
pd. to_datetime( '2020-1-1' )
pd. to_datetime( '2020/1/1' )
pd. to_datetime( '1.1.2020' )
pd. to_datetime( '1.1 2020' )
pd. to_datetime( '1 1 2020' )
pd. to_datetime( '1 1-2020' )
pd. to_datetime( '1-1 2020' )
pd. to_datetime( '1-1-2020' )
pd. to_datetime( '1/1/2020' )
pd. to_datetime( '20200101' )
pd. to_datetime( '2020.0101' )
Timestamp('2020-01-01 00:00:00')
下面的语句都会报错
此时可利用format参数强制匹配
pd. to_datetime( '2020\\1\\1' , format = '%Y\\%m\\%d' )
pd. to_datetime( '2020`1`1' , format = '%Y`%m`%d' )
pd. to_datetime( '2020.1 1' , format = '%Y.%m %d' )
pd. to_datetime( '1 1.2020' , format = '%d %m.%Y' )
Timestamp('2020-01-01 00:00:00')
同时,使用列表可以将其转为时间点索引
pd. Series( range ( 2 ) , index= pd. to_datetime( [ '2020/1/1' , '2020/1/2' ] ) )
2020-01-01 0
2020-01-02 1
dtype: int64
type ( pd. to_datetime( [ '2020/1/1' , '2020/1/2' ] ) )
pandas.core.indexes.datetimes.DatetimeIndex
对于DataFrame而言,如果列已经按照时间顺序排好,则利用to_datetime可自动转换
df = pd. DataFrame( {
'year' : [ 2020 , 2020 ] , 'month' : [ 1 , 1 ] , 'day' : [ 1 , 2 ] } )
pd. to_datetime( df)
0 2020-01-01
1 2020-01-02
dtype: datetime64[ns]
(b)时间精度与范围限制
事实上,Timestamp的精度远远不止day,可以最小到纳秒ns
pd. to_datetime( '2020/1/1 00:00:00.123456789' )
Timestamp('2020-01-01 00:00:00.123456789')
同时,它带来范围的代价就是只有大约584年的时间点是可用的
pd. Timestamp. min
Timestamp('1677-09-21 00:12:43.145225')
pd. Timestamp. max
Timestamp('2262-04-11 23:47:16.854775807')
(c)date_range方法
一般来说,start/end/periods(时间点个数)/freq(间隔方法)是该方法最重要的参数,给定了其中的3个,剩下的一个就会被确定
pd. date_range( start= '2020/1/1' , end= '2020/1/10' , periods= 3 )
DatetimeIndex(['2020-01-01 00:00:00', '2020-01-05 12:00:00',
'2020-01-10 00:00:00'],
dtype='datetime64[ns]', freq=None)
pd. date_range( start= '2020/1/1' , end= '2020/1/10' , freq= 'D' )
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
'2020-01-05', '2020-01-06', '2020-01-07', '2020-01-08',
'2020-01-09', '2020-01-10'],
dtype='datetime64[ns]', freq='D')
pd. date_range( start= '2020/1/1' , periods= 3 , freq= 'D' )
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03'], dtype='datetime64[ns]', freq='D')
pd. date_range( end= '2020/1/3' , periods= 3 , freq= 'D' )
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03'], dtype='datetime64[ns]', freq='D')
其中freq参数有许多选项,下面将常用部分罗列如下,更多选项可看这里
符号
D/B
W
M/Q/Y
BM/BQ/BY
MS/QS/YS
BMS/BQS/BYS
H
T
S
描述
日/工作日
周
月末
月/季/年末日
月/季/年末工作日
月/季/年初日
月/季/年初工作日
小时
分钟
pd. date_range( start= '2020/1/1' , periods= 3 , freq= 'T' )
DatetimeIndex(['2020-01-01 00:00:00', '2020-01-01 00:01:00',
'2020-01-01 00:02:00'],
dtype='datetime64[ns]', freq='T')
pd. date_range( start= '2020/1/1' , periods= 3 , freq= 'M' )
DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31'], dtype='datetime64[ns]', freq='M')
pd. date_range( start= '2020/1/1' , periods= 3 , freq= 'BYS' )
DatetimeIndex(['2020-01-01', '2021-01-01', '2022-01-03'], dtype='datetime64[ns]', freq='BAS-JAN')
bdate_range是一个类似与date_range的方法,特点在于可以在自带的工作日间隔设置上,再选择weekmask参数和holidays参数
它的freq中有一个特殊的’C’/‘CBM’/'CBMS’选项,表示定制,需要联合weekmask参数和holidays参数使用
例如现在需要将工作日中的周一、周二、周五3天保留,并将部分holidays剔除
weekmask = 'Mon Tue Fri'
holidays = [ pd. Timestamp( '2020/1/%s' % i) for i in range ( 7 , 13<