時(shí)間序列

一、datetime模塊

1.datetime構(gòu)造

import datetime
date=datetime.date(2018,3,2)
date
Out[ ]:datetime.date(2018, 3, 2)
date.year
Out[ ]:2018
date.month
Out[ ]:3
time=datetime.time(9,10,34)
time
Out[ ]:datetime.time(9, 10, 34)
time.second
Out[ ]:34
time.hour
Out[ ]:9
now=datetime.datetime.now()
now
Out[ ]:datetime.datetime(2020, 7, 4, 17, 20, 12, 682627)

timedelta類數(shù)據(jù)為兩個(gè)datetime類數(shù)據(jù)的差,可通過datetime類對(duì)象加或減timedelta類對(duì)象,來獲取新的datetime類對(duì)象。

delta=now-datetime.datetime(2018,3,5,9,12)
delta
Out[ ]:datetime.timedelta(days=852, seconds=29720, microseconds=911440)

delta2=now+datetime.timedelta(10)
delta2
Out[ ]:datetime.datetime(2020, 7, 14, 17, 27, 20, 911440)

2.數(shù)據(jù)轉(zhuǎn)換

轉(zhuǎn)化為字符串

test=datetime.datetime(2018,5,12)
test
Out[ ]:datetime.datetime(2018, 5, 12, 0, 0)
str(test)
Out[ ]:'2018-05-12 00:00:00'

轉(zhuǎn)化為特定格式的字符串

test.strftime('%Y/%m/%d')
Out[ ]:'2018/05/12'
test.strftime('%W')
Out[ ]:'19'

通過datetime.strptime方法可以將字符串格式轉(zhuǎn)換為datetime數(shù)據(jù)類型

value='2018-4-12'
datetime.datetime.strptime(value,'%Y-%m-%d')
Out[ ]:datetime.datetime(2018, 4, 12, 0, 0)

在pandas中,可以通過to_datetime方法將一列字符串轉(zhuǎn)換為時(shí)間數(shù)據(jù)

salary['HireDate']=pd.to_datetime(salary['HireDate'])

二、時(shí)間序列基礎(chǔ)

1.時(shí)間序列構(gòu)造

pandas 中的時(shí)間序列指的是以時(shí)間數(shù)據(jù)為索引的Series或DataFrame

import numpy as np
import pandas as pd
from datetime import datetime
date=[datetime(2018,4,1),datetime(2018,4,5),
      datetime(2018,4,7),datetime(2018,4,9),
      datetime(2018,4,10),datetime(2018,4,15)]
s=pd.Series(np.arange(6),index=date)
s
Out[ ]:
2018-04-01    0
2018-04-05    1
2018-04-07    2
2018-04-09    3
2018-04-10    4
2018-04-15    5
dtype: int32

2.索引與切片

s['20180415']
Out[ ]:5

s['2018/4/1']
Out[ ]:0

s['20180405':'20180411']
Out[ ]:
2018-04-05    1
2018-04-07    2
2018-04-09    3
2018-04-10    4
dtype: int32

s[datetime(2018,4,7):]
Out[ ]:
2018-04-07    2
2018-04-09    3
2018-04-10    4
2018-04-15    5
dtype: int32

對(duì)于長時(shí)間序列來說,可以通過年、月來輕松獲取時(shí)間序列的切片。

date2=[datetime(2018,4,1),datetime(2018,4,5),
       datetime(2018,4,13),datetime(2018,4,27),
       datetime(2018,9,4),datetime(2018,9,8),
       datetime(2019,3,2),datetime(2019,6,17)]
s2=pd.Series(np.arange(8),index=date2)
s2
Out[ ]:
2018-04-01    0
2018-04-05    1
2018-04-13    2
2018-04-27    3
2018-09-04    4
2018-09-08    5
2019-03-02    6
2019-06-17    7
dtype: int32

s2['2018']
Out[ ]:
2018-04-01    0
2018-04-05    1
2018-04-13    2
2018-04-27    3
2018-09-04    4
2018-09-08    5
dtype: int32

s2['2018-04']
Out[ ]:
2018-04-01    0
2018-04-05    1
2018-04-13    2
2018-04-27    3
dtype: int32

三、日期

1. 日期范圍

使用pd.date_range函數(shù)可以創(chuàng)建指定長度的DatetimeIndex索引,默認(rèn)時(shí)間頻率是天,通過freq參數(shù)可以使用其他頻率。

index=pd.date_range('2018/4/1','2018/5/30')
index
Out[ ]:
DatetimeIndex(['2018-04-01', '2018-04-02', '2018-04-03', '2018-04-04',
               '2018-04-05', '2018-04-06', '2018-04-07', '2018-04-08',
               '2018-04-09', '2018-04-10', '2018-04-11', '2018-04-12',
               '2018-04-13', '2018-04-14', '2018-04-15', '2018-04-16',
               '2018-04-17', '2018-04-18', '2018-04-19', '2018-04-20',
               '2018-04-21', '2018-04-22', '2018-04-23', '2018-04-24',
               '2018-04-25', '2018-04-26', '2018-04-27', '2018-04-28',
               '2018-04-29', '2018-04-30', '2018-05-01', '2018-05-02',
               '2018-05-03', '2018-05-04', '2018-05-05', '2018-05-06',
               '2018-05-07', '2018-05-08', '2018-05-09', '2018-05-10',
               '2018-05-11', '2018-05-12', '2018-05-13', '2018-05-14',
               '2018-05-15', '2018-05-16', '2018-05-17', '2018-05-18',
               '2018-05-19', '2018-05-20', '2018-05-21', '2018-05-22',
               '2018-05-23', '2018-05-24', '2018-05-25', '2018-05-26',
               '2018-05-27', '2018-05-28', '2018-05-29', '2018-05-30'],
              dtype='datetime64[ns]', freq='D')

index=pd.date_range('2018/4/1','2018/12/31',freq='M')
index
Out[ ]:
DatetimeIndex(['2018-04-30', '2018-05-31', '2018-06-30', '2018-07-31',
               '2018-08-31', '2018-09-30', '2018-10-31', '2018-11-30',
               '2018-12-31'],
              dtype='datetime64[ns]', freq='M')

在pd.date_range函數(shù)中傳入起始或結(jié)束日期,再用period參數(shù)傳入一個(gè)表示一段時(shí)間的數(shù)據(jù),就可以創(chuàng)建指定長度的DatetimeIndex索引。

pd.date_range(start='2018/4/1',periods=20)
Out[ ]:
DatetimeIndex(['2018-04-01', '2018-04-02', '2018-04-03', '2018-04-04',
               '2018-04-05', '2018-04-06', '2018-04-07', '2018-04-08',
               '2018-04-09', '2018-04-10', '2018-04-11', '2018-04-12',
               '2018-04-13', '2018-04-14', '2018-04-15', '2018-04-16',
               '2018-04-17', '2018-04-18', '2018-04-19', '2018-04-20'],
              dtype='datetime64[ns]', freq='D')
pd.date_range(end='2018/4/1',periods=20)
Out[ ]:
DatetimeIndex(['2018-03-13', '2018-03-14', '2018-03-15', '2018-03-16',
               '2018-03-17', '2018-03-18', '2018-03-19', '2018-03-20',
               '2018-03-21', '2018-03-22', '2018-03-23', '2018-03-24',
               '2018-03-25', '2018-03-26', '2018-03-27', '2018-03-28',
               '2018-03-29', '2018-03-30', '2018-03-31', '2018-04-01'],
              dtype='datetime64[ns]', freq='D')

2. 頻率與移動(dòng)

  • 時(shí)間序列的常用基礎(chǔ)頻率
    D:每日歷日
    B:每工作日
    H:每小時(shí)
    T或者min:每分鐘
    S:每秒
pd.date_range(start='2018/4/1',periods=20,freq='2H20min38S')
Out[ ]:
DatetimeIndex(['2018-04-01 00:00:00', '2018-04-01 02:20:38',
               '2018-04-01 04:41:16', '2018-04-01 07:01:54',
               '2018-04-01 09:22:32', '2018-04-01 11:43:10',
               '2018-04-01 14:03:48', '2018-04-01 16:24:26',
               '2018-04-01 18:45:04', '2018-04-01 21:05:42',
               '2018-04-01 23:26:20', '2018-04-02 01:46:58',
               '2018-04-02 04:07:36', '2018-04-02 06:28:14',
               '2018-04-02 08:48:52', '2018-04-02 11:09:30',
               '2018-04-02 13:30:08', '2018-04-02 15:50:46',
               '2018-04-02 18:11:24', '2018-04-02 20:32:02'],
              dtype='datetime64[ns]', freq='8438S')
  • 移動(dòng)數(shù)據(jù)是沿著時(shí)間索引將數(shù)據(jù)向前移或者向后移,通過用shift方法可以完成移動(dòng)數(shù)據(jù)操作。
date4=pd.date_range('2018/4/1',periods=5)
s=pd.Series(np.arange(5),index=date4)
s
Out[ ]:
2018-04-01    0
2018-04-02    1
2018-04-03    2
2018-04-04    3
2018-04-05    4
Freq: D, dtype: int32
s.shift(2)
Out[ ]:
2018-04-01    NaN
2018-04-02    NaN
2018-04-03    0.0
2018-04-04    1.0
2018-04-05    2.0
Freq: D, dtype: float64
s.shift(-2)
Out[ ]:
2018-04-01    2.0
2018-04-02    3.0
2018-04-03    4.0
2018-04-04    NaN
2018-04-05    NaN
Freq: D, dtype: float64

如果再shift方法中傳入頻率參數(shù)freq,就是修改索引了。

s.shift(2,freq='D')
Out[ ]:
2018-04-03    0
2018-04-04    1
2018-04-05    2
2018-04-06    3
2018-04-07    4
Freq: D, dtype: int32

四、時(shí)期

1. 時(shí)期基礎(chǔ)

Peries可以創(chuàng)建時(shí)期數(shù)據(jù)類型,傳入字符串或者整數(shù)、頻率即可。

p=pd.Period(2018,'A-DEC')
p
Out[ ]:
Period('2018', 'A-DEC')
p+2
Out[ ]:
Period('2020', 'A-DEC')

類似于pd.date_range,pd.period_range函數(shù)可以創(chuàng)建時(shí)期范圍,PeriodIndex索引同樣可以構(gòu)造Series或者DataFrame。

date5=pd.period_range('2018/4/1','2018/10/5',freq='M')
date5
Out[ ]:
PeriodIndex(['2018-04', '2018-05', '2018-06', '2018-07', '2018-08', '2018-09',
             '2018-10'],
            dtype='period[M]', freq='M')

2. 頻率轉(zhuǎn)換

Period和PeriodIndex對(duì)象可以通過asfreq方法轉(zhuǎn)換頻率,如將年度轉(zhuǎn)換為月度。

p=pd.Period(2018,freq='A-DEC')
p
Out[ ]:
Period('2018', 'A-DEC')

p.asfreq('M',how='start')
Out[ ]:
Period('2018-01', 'M')
date6=pd.period_range('2014','2018',freq='A-DEC')
date6
Out[ ]:
PeriodIndex(['2014', '2015', '2016', '2017', '2018'], dtype='period[A-DEC]', freq='A-DEC')

ps=pd.Series(np.arange(5),index=date6)
ps
Out[ ]:
2014    0
2015    1
2016    2
2017    3
2018    4
Freq: A-DEC, dtype: int32

利用to_period方法可以將由時(shí)間戳索引的時(shí)間序列數(shù)據(jù)轉(zhuǎn)換為以時(shí)期為索引,通過to_timestamp方法可以進(jìn)行逆操作。

date7=pd.date_range('2018/4/1',periods=4,freq='M')
s=pd.Series(np.arange(4),index=date7)
s
Out[ ]:
2018-04-30    0
2018-05-31    1
2018-06-30    2
2018-07-31    3
Freq: M, dtype: int32

ps=s.to_period()
ps
Out[ ]:
2018-04    0
2018-05    1
2018-06    2
2018-07    3
Freq: M, dtype: int32

五、頻率轉(zhuǎn)換與重采樣

1. 重采樣

pd.resample用于各種頻率的轉(zhuǎn)換工作,如將間隔為‘天’的頻率聚合轉(zhuǎn)換為‘月度’的頻率。

date=pd.date_range('2018/4/1',periods=100,freq='D')
s=pd.Series(np.arange(100),index=date)
s.head(10)
Out[ ]:
2018-04-01    0
2018-04-02    1
2018-04-03    2
2018-04-04    3
2018-04-05    4
2018-04-06    5
2018-04-07    6
2018-04-08    7
2018-04-09    8
2018-04-10    9
Freq: D, dtype: int32

s.resample('M').mean()
Out[ ]:
2018-04-30    14.5
2018-05-31    45.0
2018-06-30    75.5
2018-07-31    95.0
Freq: M, dtype: float64
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容