時間序列分析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天
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)
結果如下:
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對象
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)
結果分别為:
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')
結果為:
3.2 直接索引
代碼如下:
#方法2
print(time['2020-10-29'])
print('----------------------')
print(time['2020-10-29':'2020-11-17'])
結果為:
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))
結果:
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中時間序列建立和修改的相關文法。