时间序列基础

Posted nxf-rabbit75

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了时间序列基础相关的知识,希望对你有一定的参考价值。

一、时间戳索引DatetimeIndex

生成20个DatetimeIndex

from datetime import datetime
dates = pd.date_range(start=‘2019-04-01‘,periods=20)
dates

技术图片

 用这20个索引作为ts的索引

ts = pd.Series(np.random.randn(20),index=dates)
ts

技术图片

不同索引的时间序列之间的算术运算在日期上自动对齐

ts + ts[::2]

技术图片

pandas使用numpy的datetime64数据类型在纳秒级的分辨率下存储时间戳

ts.index.dtype 

技术图片

DatetimeIndex中的标量值是pandas的Timestamp对象

stamp =ts.index[0]
stamp

技术图片

 

二、索引、选择

1. 索引 

ts是一个series;

stamp是索引为2的时间戳,Timestamp(‘2019-04-03 00:00:00‘, freq=‘D‘)

stamp =ts.index[2]
ts[stamp]

技术图片

 

为了方便,可以传递一个能解释为日期的字符串

技术图片

 

2. 选择

(1)对于长的时间序列,可以传递一个年份或一个年份和月份来选择数据的切片

longer_ts = pd.Series(np.random.randn(10),index=pd.date_range(‘4/1/2019‘,periods=10))
longer_ts

技术图片

选择2019年4月份的所有数据

longer_ts.loc[‘2019-4‘]#可以写成‘2019/04‘,不能写成‘201904‘

技术图片

 选择2019年的所有数据

longer_ts[‘2019‘] 

技术图片

(2)选择一段时间内的数据

ts[datetime(2019,1,1):]

技术图片

ts[‘1/4/2019‘:‘4/10/2019‘]

技术图片

truncate也可以实现在两个日期间对Series进行切片

ts.truncate(after=‘4/3/2019‘)

技术图片

以上操作也都适用于DataFrame

  

 三、含有重复索引的时间序列

 在某些应用中,可能会有多个数据观察值落在特定的时间戳中。

dates = pd.DatetimeIndex([‘4/1/2019‘,‘4/2/2019‘,‘4/2/2019‘,‘4/2/2019‘,‘4/3/2019‘])

dup_ts = pd.Series(np.arange(5),index=dates)
dup_ts

技术图片

通过检查索引的is_unique属性,我们可以看出索引并不是唯一的。

dup_ts.index.is_unique

技术图片

对上面的Series进行索引,结果是标量值还是Series切片取决于是否有时间戳是重复的。

技术图片

假设你想要聚合含有非唯一时间戳的数据,一种方式就是使用groupby并传递level=0

技术图片

 

四、日期范围、频率和移位

  有些应用中经常需要处理固定频率的场景,例如每日的、每月的或每10分钟,这意味着我们甚至需要在必要的时候向时间序列中引入缺失值。pandas可以帮助我们重新采样、推断频率以及生成固定频率的数据范围。

1. 生成日期范围

index = pd.date_range(‘2019-4-1‘,‘2019-4-30‘)
index

技术图片

默认情况下,date_range生成的是每日的时间戳,如果只传递一个起始或结尾日期,就必须要传递一个用于生成范围的数字

pd.date_range(start=‘2019-4-1‘,periods=30)

技术图片

pd.date_range(end=‘2019-4-30‘,periods=30)

技术图片

开始日期和结束日期严格定义了生成日期索引的边界。如果,需要一个包含每月最后业务日期的时间索引,可以传递“BM”频率(business and of month,月度业务结尾),只有落在或在日期范围内的日期会包括:

pd.date_range(start=‘2019-1‘,end=‘2019-12‘,freq=‘BM‘)

技术图片

其他的一些频率值,见下图

技术图片

技术图片

 

有时候会获得包含时间信息的开始日期或结束日期,但是想要生成的是标准化为零点的时间戳。用normalize=Tue就可以解决。

pd.date_range(start=‘2019-4-1 12:45:23‘,periods=5) #不加normalize

技术图片

pd.date_range(start=‘2019-4-1 12:45:23‘,periods=5,normalize=True)

技术图片

 

2. 频率和日期偏置

 pandas中的频率是由基础频率和倍数组成的。基础频率通常会有字符串别名,例如‘M’代表每月,‘H’代表每小时。对于每个基础频率,都有一个对象可以被用于定义日期偏置。例如,每小时的频率可以使用Hour类来表示。

from pandas.tseries.offsets import Hour,Minute
hour = Hour()
hour

技术图片

four_hours = Hour(4)
four_hours

技术图片

pd.date_range(start=‘2019-4-1‘,periods=5,freq=‘4h‘)

技术图片

pd.date_range(start=‘2019-4-1‘,periods=5,freq=‘1h30min‘)

技术图片

月中某星期的日期week of month  

例子:每月第三个星期五  

rng = pd.date_range(‘2019-4-1‘,‘2019-7-5‘,freq=‘WOM-3FRI‘)
list(rng)

技术图片

 

3. 移位(前向和后向)日期

   “移位”是指将日期按时间向前移动或向后移动。Series和DataFrame都有一个shift方法用于进行简单的前向或后向移位,而不改变索引

(1)shift

ts = pd.Series(np.random.randn(4),
              index=pd.date_range(‘4/1/2019‘,periods=4,freq=‘M‘))
ts

技术图片

ts.shift(2)

技术图片

ts.shift(-2)

技术图片

由于简单移位并不改变索引,一些数据会被丢弃。因此,如果频率是已知的,则可以将频率传递给shift来推移时间戳而不是简单的数据:

ts.shift(2,freq=‘D‘)

技术图片

ts.shift(2,freq=‘M‘) #‘M‘日历月末

技术图片

ts.shift(2,freq=‘BM‘) #‘BM‘月内最后工作日

技术图片

(2)使用偏置进行移位日期

from pandas.tseries.offsets import Day,MonthEnd
now = datetime.now()
now

技术图片

now + 3 * Day()

技术图片

 

如果添加锚定偏置量,比如MonthEnd,根据频率规则,第一个增量会将日期“前滚”到下一个日期:

now + MonthEnd()

技术图片

now + MonthEnd(2)

技术图片

锚定偏置可以使用rollforwardrollback分别显示地将日期向前或向后“滚动”;

offset = MonthEnd()
offset.rollforward(now)

技术图片

offset.rollback(now)

技术图片

 

将移位方法与groupby一起使用是日期偏置的一种创造性用法:

ts = pd.Series(np.random.randn(20),index=pd.date_range(‘4/1/2019‘,periods=20,freq=‘4d‘))
ts

技术图片

ts.groupby(offset.rollforward).mean()

技术图片

resample可以得到同样的结果

ts.resample(‘M‘).mean()

技术图片

 

四、时区处理

待用到时候再添加  

  

 

五、时间区间和区间算术

1. 区间频率转换

2. 季度区间频率

3. 将时间戳转换为区间

4. 从数组生成PeriodIndex

 

 

 

六、重新采样与频率转换

1. 向下采样

2. 向上采样与插值

3. 使用区间进行重新采样

 

七、移动窗口函数

1. 指数加权函数

2. 二元移动窗口函数

3. 用户自定义的移动窗口函数

 

 

  

  

  

  

  

  

 

  

  

  

  

 

 

 

以上是关于时间序列基础的主要内容,如果未能解决你的问题,请参考以下文章

201555332盛照宗—网络对抗实验1—逆向与bof基础

VsCode 代码片段-提升研发效率

20155201 李卓雯 《网络对抗技术》实验一 逆向及Bof基础

JSP基础

动态SQL基础概念复习(Javaweb作业5)

小程序基础13:模板