学习链接: 第9章 时序数据.
九、时序数据
9.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 |
9.2 时序的创建
9.2.1Date times 时间点的创建
-
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('1-1 2020') pd.to_datetime('1-1-2020') pd.to_datetime('1/1/2020') pd.to_datetime('2020`1`1',format='%Y`%m`%d') #或者拿format参数强制匹配
② 使用列表的时候,索引设置为时间点索引
输入: df = pd.DataFrame({ 'year': [2020, 2020],'month': [1, 1], 'day': [1, 2]}, index=pd.to_datetime(['2020/1/1','2020/1/2'])) 输出: year month day 2020-01-01 2020 1 1 2020-01-02 2020 1 2
对于DataFrame而言,如果列已经按照时间顺序排好,则利用to_datetime可自动转换
输入:pd.to_datetime(df) 输出: 2020-01-01 2020-01-01 2020-01-02 2020-01-02 dtype: datetime64[ns]
③ 时间精度与范围限制
Timestamp的精度远远不止day,可以最小到纳秒ns。pd.to_datetime('2020/1/1 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')
-
date_range()
start/end/periods(时间点个数)/freq(间隔方法)是该方法最重要的参数,给定了其中的3个,剩下的一个就会被确定。
其中freq参数有许多选项,常用如下:符号 描述 S 秒 T 分钟 H 小时 D 日 B 工作日 W 周 M/Q/Y 月/季/年末 BM/BQ/BY 月/季/年末最后一个工作日 BMS/BQS/BYS 月/季/年初首一个工作日 输入: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(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的方法,特点在于可以定制工作日。它的freq中有一个特殊的’C’/‘CBM’/'CBMS’选项,表示定制,需要联合weekmask参数和holidays参数使用。weekmask = 'Mon Tue Fri' holidays = [pd.Timestamp('2020/1/%s'%i) for i in range(7,13)] #工作日周一周二周五,假期7-12日 pd.bdate_range(start='2020-1-1',end='2020-1-15',freq='C',weekmask=weekmask,holidays=holidays)
9.2.2 Dateoffset对象
① DataOffset与Timedelta的区别
Timedelta绝对时间差的特点指无论是冬令时还是夏令时,增减 1day都只计算24小时
DataOffset相对时间差指,无论一天是23\24\25小时,增减1day都与当天相同的时间保持一致
输入:ts = pd.Timestamp('2020-3-29 01:00:00', tz='Europe/Helsinki')
ts + pd.Timedelta(days=1)
ts + pd.DateOffset(days=1)
输出:
#绝对时间差
Timestamp('2020-03-30 02:00:00+0300', tz='Europe/Helsinki')
#相对时间差
Timestamp('2020-03-30 01:00:00+0300', tz='Europe/Helsinki')
但只要把tz(time zone)去除就可以不用管它了,两者保持一致,除非要使用到时区变换
输入:
ts = pd.Timestamp('2020-3-29 01:00:00')
ts + pd.Timedelta(days=1)
ts + pd.DateOffset(days=1)
输出:
#绝对时间差
Timestamp('2020-03-30 01:00:00')
#相对时间差
Timestamp('2020-03-30 01:00:00')
② 增减一段时间
DateOffset的可选参数包括years/months/weeks/days/hours/minutes/seconds
输入:
pd.Timestamp('2020-01-01') + pd.DateOffset(minutes=20) - pd.DateOffset(weeks=2)
输出:
Timestamp('2019-12-18 00:20:00')
③ 各类常用offset对象
freq | 对象 |
---|---|
S | Second |
T | Minute |
H | Hour |
D | DateOffset |
B | BDay |
W | Week |
C | CDay(定制工作日) |
(B)M/(B)Q/(B)Y | (B)MonthEnd/(B)QuarterEnd/(B)YearEnd |
(B)MS/(B)QS/(B)YS | (B)MonthBegin/(B)QuarterBegin/(B)YearBegin |
输入:
pd.Timestamp('2020-01-01') + pd.offsets.BQuarterBegin(1)
输出:
Timestamp('2020-03-02 00:00:00')
输入:
pd.Series(pd.offsets.CDay(3,weekmask='Wed Fri',holidays='2020010').apply(i)
for i in pd.date_range('20200105',periods=3,freq='D'))
输出:
0 2020-01-15
1 2020-01-15
2 2020-01-15
dtype: datetime64[ns]
④ 序列的offset操作
#利用apply函数
输入:
pd.Series(pd.offsets.BYearBegin(3).apply(i) for i in pd.date_range('20200101',periods=3,freq='Y'))
输出:
0 2023