时间序列分析1——时间序列的创建
前言
本文主要介绍时间序列、统计时序分析的相关概念以及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中时间序列创建和修改的相关语法。