时间序列
时间模块
import numpy as np
import pandas as pd
from datetime import datetime
from datetime import timedelta
# 获取当前时间
now=datetime.now()
now
Out[4]: datetime.datetime(2020, 2, 27, 9, 49, 39, 385919)
now.year
Out[5]: 2020
now.month
Out[6]: 2
now.day
Out[7]: 27
# 时间差
deta1=datetime(2020,2,2)
deta2=datetime(2018,2,3)
delt=deta1-deta2
delt
Out[11]: datetime.timedelta(days=729)
delt.days
Out[15]: 729
delt.total_seconds()
Out[16]: 62985600.0
deta2+delt
Out[18]: datetime.datetime(2020, 2, 2, 0, 0)
# timedelta(天数)
deta2
Out[19]: datetime.datetime(2018, 2, 3, 0, 0)
deta2+timedelta(4.5)
Out[20]: datetime.datetime(2018, 2, 7, 12, 0)
日期可视化:
deta2
Out[21]: datetime.datetime(2018, 2, 3, 0, 0)
str(deta2)
Out[22]: '2018-02-03 00:00:00'
deta2.strftime('%Y/%m/%d %H:%M:%S')
Out[23]: '2018/02/03 00:00:00'
deta2.strftime('%y/%m/%d %H:%M:%S')
Out[24]: '18/02/03 00:00:00'
datetime.strptime('2018/02/03 00:00:00','%Y/%m/%d %H:%M:%S')
Out[25]: datetime.datetime(2018, 2, 3, 0, 0)
创建时间datetime
dates=[datetime(2020,2,2),datetime(2020,2,5),datetime(2020,2,6)]
s=pd.Series(np.random.randn(3),index=dates)
s
Out[28]:
2020-02-02 -1.081661
2020-02-05 -1.163819
2020-02-06 1.822399
dtype: float64
# date_range
pd.date_range('20200203','20200205')
Out[29]: DatetimeIndex(['2020-02-03', '2020-02-04', '2020-02-05'], dtype='datetime64[ns]', freq='D')
pd.date_range('20200203',periods=5)
Out[30]:
DatetimeIndex(['2020-02-03', '2020-02-04', '2020-02-05', '2020-02-06',
'2020-02-07'],
dtype='datetime64[ns]', freq='D')
创建时期period:
p=pd.Period(2020,freq='M')
p
Out[32]: Period('2020-01', 'M')
p+2
Out[33]: Period('2020-03', 'M')
# 创建时期序列
pd.period_range('20200202',periods=10,freq='M')
Out[34]:
PeriodIndex(['2020-02', '2020-03', '2020-04', '2020-05', '2020-06', '2020-07',
'2020-08', '2020-09', '2020-10', '2020-11'],
dtype='period[M]', freq='M')
时期单位转换:
a=pd.Period(2020)
a
Out[36]: Period('2020', 'A-DEC')
a.asfreq('M')
Out[37]: Period('2020-12', 'M')
# 时期是一段时间 -MAR 到3月截止
a=pd.Period('202004',freq='M')
a
Out[40]: Period('2020-04', 'M')
a.asfreq('A-DEC')
Out[41]: Period('2020', 'A-DEC')
a.asfreq('A-MAR')
Out[42]: Period('2021', 'A-MAR')
# 时期是一段时间 Q 季度
p=pd.Period('2020Q4','Q-JAN')
p
Out[44]: Period('2020Q4', 'Q-JAN')
p.asfreq('M',how='start'),p.asfreq('M',how='end')
Out[45]: (Period('2019-11', 'M'), Period('2020-01', 'M'))
# 获取该季度倒数第二个工作日下午4点20分
# 'B'是工作日,'T'是分钟
p
Out[47]: Period('2020Q4', 'Q-JAN')
(p.asfreq('B')-1).asfreq('T')+16*60+20
Out[48]: Period('2020-01-31 16:19', 'T')
date_range -> period
# date_range -> period
s=pd.Series(np.random.randn(5),index=pd.date_range('20200202',periods=5,freq='M'))
s
Out[50]:
2020-02-29 0.148680
2020-03-31 0.282707
2020-04-30 -0.163206
2020-05-31 0.336857
2020-06-30 1.869413
Freq: M, dtype: float64
s.to_period()
Out[51]:
2020-02 0.148680
2020-03 0.282707
2020-04 -0.163206
2020-05 0.336857
2020-06 1.869413
Freq: M, dtype: float64
###
s=pd.Series(np.random.randn(5),index=pd.date_range('20200228',periods=5,freq='D'))
#tr=s.to_period()
#tr
#Out[58]:
#2020-02-28 -0.580936
#2020-02-29 -0.553333
#2020-03-01 0.542444
#2020-03-02 -0.645528
#2020-03-03 -0.679975
#Freq: D, dtype: float64
#tr.index
#Out[59]:
#PeriodIndex(['2020-02-28', '2020-02-29', '2020-03-01', '2020-03-02',
#'2020-03-03'],
#dtype='period[D]', freq='D')
tr=s.to_period(freq='M')
tr
Out[64]:
2020-02 -0.580936
2020-02 -0.553333
2020-03 0.542444
2020-03 -0.645528
2020-03 -0.679975
Freq: M, dtype: float64
tr.index
Out[65]: PeriodIndex(['2020-02', '2020-02', '2020-03', '2020-03', '2020-03'], dtype='period[M]', freq='M')
tr.groupby(level=0).sum()
Out[67]:
2020-02 -1.134270
2020-03 -0.783059
Freq: M, dtype: float64
# 转回datetime
tr.to_timestamp()
Out[70]:
2020-02-01 -0.580936
2020-02-01 -0.553333
2020-03-01 0.542444
2020-03-01 -0.645528
2020-03-01 -0.679975
dtype: float64
tr.to_timestamp().index
Out[71]:
DatetimeIndex(['2020-02-01', '2020-02-01', '2020-03-01', '2020-03-01',
'2020-03-01'],
dtype='datetime64[ns]', freq=None)
时间重采样
# 股份成交量
s=pd.Series(np.random.randint(0,50,60),index=pd.date_range('20200203 08:30',periods=60,freq='T'))
s
Out[74]:
2020-02-03 08:30:00 8
2020-02-03 08:31:00 39
2020-02-03 08:32:00 17
2020-02-03 08:33:00 14
2020-02-03 08:34:00 1
2020-02-03 08:35:00 28
2020-02-03 08:36:00 45
2020-02-03 08:37:00 20
2020-02-03 08:38:00 38
2020-02-03 08:39:00 9
2020-02-03 08:40:00 4
2020-02-03 08:41:00 32
2020-02-03 08:42:00 21
2020-02-03 08:43:00 13
2020-02-03 08:44:00 37
2020-02-03 08:45:00 48
2020-02-03 08:46:00 30
2020-02-03 08:47:00 0
2020-02-03 08:48:00 17
2020-02-03 08:49:00 23
2020-02-03 08:50:00 14
2020-02-03 08:51:00 24
2020-02-03 08:52:00 28
2020-02-03 08:53:00 39
2020-02-03 08:54:00 13
2020-02-03 08:55:00 1
2020-02-03 08:56:00 23
2020-02-03 08:57:00 24
2020-02-03 08:58:00 9
2020-02-03 08:59:00 42
2020-02-03 09:00:00 22
2020-02-03 09:01:00 4
2020-02-03 09:02:00 29
2020-02-03 09:03:00 41
2020-02-03 09:04:00 7
2020-02-03 09:05:00 25
2020-02-03 09:06:00 0
2020-02-03 09:07:00 35
2020-02-03 09:08:00 10
2020-02-03 09:09:00 29
2020-02-03 09:10:00 12
2020-02-03 09:11:00 43
2020-02-03 09:12:00 32
2020-02-03 09:13:00 23
2020-02-03 09:14:00 46
2020-02-03 09:15:00 26
2020-02-03 09:16:00 6
2020-02-03 09:17:00 9
2020-02-03 09:18:00 34
2020-02-03 09:19:00 3
2020-02-03 09:20:00 0
2020-02-03 09:21:00 30
2020-02-03 09:22:00 23
2020-02-03 09:23:00 22
2020-02-03 09:24:00 19
2020-02-03 09:25:00 21
2020-02-03 09:26:00 20
2020-02-03 09:27:00 12
2020-02-03 09:28:00 48
2020-02-03 09:29:00 39
Freq: T, dtype: int32
# 以5分钟采样
s.resample('5min',how=sum)
Out[82]:
2020-02-03 08:30:00 79
2020-02-03 08:35:00 140
2020-02-03 08:40:00 107
2020-02-03 08:45:00 118
2020-02-03 08:50:00 118
2020-02-03 08:55:00 99
2020-02-03 09:00:00 103
2020-02-03 09:05:00 99
2020-02-03 09:10:00 156
2020-02-03 09:15:00 78
2020-02-03 09:20:00 94
2020-02-03 09:25:00 140
Freq: 5T, dtype: int32
s.resample('5min',how=sum,label='right')
Out[83]:
2020-02-03 08:35:00 79
2020-02-03 08:40:00 140
2020-02-03 08:45:00 107
2020-02-03 08:50:00 118
2020-02-03 08:55:00 118
2020-02-03 09:00:00 99
2020-02-03 09:05:00 103
2020-02-03 09:10:00 99
2020-02-03 09:15:00 156
2020-02-03 09:20:00 78
2020-02-03 09:25:00 94
2020-02-03 09:30:00 140
Freq: 5T, dtype: int32
## 通过groupby重采样
tr=pd.Series(np.random.randint(0,50,100),index=pd.date_range('20200301',periods=100,freq='D'))
tr
Out[87]:
2020-03-01 39
2020-03-02 31
2020-03-03 4
2020-03-04 22
2020-03-05 2
2020-03-06 8
2020-03-07 10
2020-03-08 3
2020-03-09 44
2020-03-10 25
2020-03-11 29
2020-03-12 39
2020-03-13 4
2020-03-14 22
2020-03-15 16
2020-03-16 8
2020-03-17 39
2020-03-18 2
2020-03-19 25
2020-03-20 10
2020-03-21 9
2020-03-22 49
2020-03-23 10
2020-03-24 38
2020-03-25 25
2020-03-26 47
2020-03-27 33
2020-03-28 35
2020-03-29 41
2020-03-30 22
..
2020-05-10 31
2020-05-11 17
2020-05-12 22
2020-05-13 32
2020-05-14 46
2020-05-15 26
2020-05-16 30
2020-05-17 12
2020-05-18 45
2020-05-19 48
2020-05-20 42
2020-05-21 19
2020-05-22 21
2020-05-23 47
2020-05-24 20
2020-05-25 25
2020-05-26 24
2020-05-27 11
2020-05-28 34
2020-05-29 38
2020-05-30 3
2020-05-31 14
2020-06-01 48
2020-06-02 41
2020-06-03 47
2020-06-04 7
2020-06-05 23
2020-06-06 24
2020-06-07 7
2020-06-08 6
Freq: D, Length: 100, dtype: int32
tr.groupby(lambda x : x.month).sum()
Out[90]:
3 693
4 760
5 818
6 203
dtype: int32
tr.groupby(tr.index.to_period('M')).sum()
Out[92]:
2020-03 693
2020-04 760
2020-05 818
2020-06 203
Freq: M, dtype: int32
采样插值:
df=pd.DataFrame(np.random.randint(1,50,2),index=pd.date_range('20200202',periods=2,freq='W-FRI'))
df
Out[94]:
0
2020-02-07 29
2020-02-14 42
df.resample('D',fill_method='ffill')
Out[95]:
0
2020-02-07 29
2020-02-08 29
2020-02-09 29
2020-02-10 29
2020-02-11 29
2020-02-12 29
df
Out[96]:
0
2020-02-07 29
2020-02-14 42
df.resample('W-MON',fill_method='ffill')
Out[97]:
0
2020-02-10 29
2020-02-17 42