天天看點

時間序列分析1——時間序列的概念及建立時間序列分析1——時間序列的建立前言一、時間序列及其觀察值序列二、統計時序分析三、用Python建立時間序列總結

時間序列分析1——時間序列的建立

文章目錄

  • 時間序列分析1——時間序列的建立
  • 前言
  • 一、時間序列及其觀察值序列
    • 1. 時間序列的定義:
    • 2. (序列長度為n的)觀察值序列:
  • 二、統計時序分析
    • 1. 頻域分析方法:
    • 2. 時域分析方法
  • 三、用Python建立時間序列
    • 0.導入庫
    • 1.pd.date_range()方法
    • 2.設定series或dataframe的索引為時間:
      • 2.1series或dataframe已存在,設定索引為時間
      • 2.2 直接建立索引為時間(DatetimeIndex)的series或dataframe
      • 3.時間序列的截取——time.truncate() 方法和直接索引
        • 3.1 time.truncate()方法
        • 3.2 直接索引
      • 4.指定時間戳、時間區間、時間偏移量delta
        • 4.1 指定時間戳
        • 4.2 指定時間區間
        • 4.3 時間偏移量 pd.Timedelta()
        • 4.4 時點序列和時域序列的差別
        • 4.5 時間戳和時間周期的轉換
  • 總結

前言

本文主要介紹時間序列、統計時序分析的相關概念以及Python中時間序列的建立

一、時間序列及其觀察值序列

1. 時間序列的定義:

  • 一個随機事件在各時點的值所構成的序列。數學表述: { X t , t ∈ T } \left\{ X_t,t \in T \right\} {Xt​,t∈T}。
  • 注意 X t X_t Xt​是一組随機變量,而非一個。

2. (序列長度為n的)觀察值序列:

它表示随機序列的n個有序觀察值。數學表述: { x t , t = 1 , … , n } \left\{x_t, t=1,…,n \right\} {xt​,t=1,…,n}

二、統計時序分析

1. 頻域分析方法:

  • 任何一種無趨勢的時間序列
  • 都可以分解成
  • 幾個不同頻率的周期波動
  • 也稱為“譜分析”

2. 時域分析方法

  • 從序列自相關的角度
  • 揭示時序的發展規律
  • 事件的發展通常具有一定的慣性,這種慣性表現為序列的自相關關系

三、用Python建立時間序列

0.導入庫

import pandas as pd
import numpy as np
import datetime as dt
           

1.pd.date_range()方法

  1. 用途:用于生成一個時間序列
  2. 使用方法:
    • 法1:可以指定開始時間、總天數和公差
    • 法2:也可以指定開始時間、終止時間和公差

代碼如下:

#方法一:給定開始時間、總共天數、公差(頻率)為1天
time_series1=pd.date_range('2020-09-21',periods=39,freq='d')
print(time_series1)
#方法二:給定開始時間、結束時間、公差(頻率)為1天
time_series2=pd.date_range('2020-09-21','2020-10-29',freq='d')
print(time_series2)
           

結果如下:

時間序列分析1——時間序列的概念及建立時間序列分析1——時間序列的建立前言一、時間序列及其觀察值序列二、統計時序分析三、用Python建立時間序列總結

2.設定series或dataframe的索引為時間:

  • xxx.set_index()方法
  • pd.Series(values,index=pd.date_range())

2.1series或dataframe已存在,設定索引為時間

方法都是相同的:使用 xxx.set_index() 方法。

代碼如下:

#2.1 設定dataframe對象的索引為時間:
#建立一個dataframe對象:
data=pd.DataFrame([['2','1','a'],['3','5','加油啊!']],columns=['c1','c2','c3'])
print(data)
#修改該df對象的索引為時間:df.set_index()方法
data_new=data.set_index(pd.date_range('2020-10-28','2020-10-29',freq='d'))
print(data_new)
print(type(data_new.index))
           

結果如下。注意現在的index是datetimes中的DatetimeIndex對象

時間序列分析1——時間序列的概念及建立時間序列分析1——時間序列的建立前言一、時間序列及其觀察值序列二、統計時序分析三、用Python建立時間序列總結

2.2 直接建立索引為時間(DatetimeIndex)的series或dataframe

  • pd.Series(values,index=pd.date_range())
  • pd.DataFrame(二維清單,columns=[‘c1’,‘c2’,‘c3’],index=pd.date_range())
values=np.random.randn(20)
time=pd.Series(values,
					index=pd.date_range(dt.datetime(2020,10,29),periods=20))
#dt.datetime(2020,10,28)與'2020-10-18'效果相同
           
data=pd.DataFrame([['2','1','a'],['3','5','加油啊!']],columns=['c1','c2','c3'],index=pd.date_range('2020-10-28','2020-10-29'))
print(data)
           

結果分别為:

時間序列分析1——時間序列的概念及建立時間序列分析1——時間序列的建立前言一、時間序列及其觀察值序列二、統計時序分析三、用Python建立時間序列總結
時間序列分析1——時間序列的概念及建立時間序列分析1——時間序列的建立前言一、時間序列及其觀察值序列二、統計時序分析三、用Python建立時間序列總結

3.時間序列的截取——time.truncate() 方法和直接索引

  • time.truncate(before=’’,after=’’):截取從before開始到after結束的時間序列
  • 也可以使用== time[before:after] ==直接截取時間序列(before和after都包含在内)

3.1 time.truncate()方法

代碼如下:

#方法1
time.truncate(before='2020-11-1',after='2020-11-17')
           

結果為:

時間序列分析1——時間序列的概念及建立時間序列分析1——時間序列的建立前言一、時間序列及其觀察值序列二、統計時序分析三、用Python建立時間序列總結

3.2 直接索引

代碼如下:

#方法2
print(time['2020-10-29'])
print('----------------------')
print(time['2020-10-29':'2020-11-17'])
           

結果為:

時間序列分析1——時間序列的概念及建立時間序列分析1——時間序列的建立前言一、時間序列及其觀察值序列二、統計時序分析三、用Python建立時間序列總結

4.指定時間戳、時間區間、時間偏移量delta

4.1 指定時間戳

代碼:

t1=pd.Timestamp('2016-07-10')
# 可以指定更多細節
t2=pd.Timestamp('2016-07-10 10')
t3=pd.Timestamp('2016-07-10 10:15')
t4=pd.Timestamp('2016-07-10 10:15:29')
print(t1)
print(t2)
print(t3)
print(t4)
print('--------------------')
print(type(t4))
           

結果:

時間序列分析1——時間序列的概念及建立時間序列分析1——時間序列的建立前言一、時間序列及其觀察值序列二、統計時序分析三、用Python建立時間序列總結

4.2 指定時間區間

pd.period()

print(pd.Period('2016-01'))
print(pd.Period('2016-01-01'))
print('---------------')
print(type(pd.Period('2016-01')))
           

4.3 時間偏移量 pd.Timedelta()

delta_t=pd.Timedelta('1 day')
print(delta_t)
print('--------------------')
print(pd.Period('2016-01-01 10:10') + delta_t)
print('--------------------')
print(pd.Timestamp('2016-01-01 10:10') + pd.Timedelta('1 day'))
print('--------------------')
print(pd.Timestamp('2016-01-01 10:10') + pd.Timedelta('15 ns'))
           

4.4 時點序列和時域序列的差別

  • 時點序列: DatetimeIndex
  • 時域序列: PeriodIndex
p1 = pd.date_range('2016-01-01 10:10', freq = '25H', periods = 10)
p2 = pd.period_range('2016-01-01 10:10', freq = '1d1h', periods = 10)#'25H'也可以寫成1d1h
print('時點序列:',p1)
print('---------------')
print('時域序列:',p2)
           

4.5 時間戳和時間周期的轉換

ts = pd.Series(range(10), index=pd.date_range('07-10-16 8:00', periods = 10, freq = 'H'))
print(ts)
print('-------上面是時點序列,下面是時域序列:--------')
ts_period = ts.to_period()#時間戳轉換為時間周期
print(ts_period)
print('-------将時域序列再轉換為時點序列:--------')
print(ts_period.to_timestamp())
           

總結

本文主要介紹了時間序列、統計時序分析的相關概念,以及Python中時間序列建立和修改的相關文法。