pandas时间序列,时间重采样

时间序列

时间模块

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值