Java实现协整 示例_时间序列基础(示例代码)

本文详细介绍了Pandas中时间序列的操作,包括使用DatetimeIndex生成时间戳,系列的索引与选择,处理重复索引,以及日期范围、频率和移位的概念。通过示例展示了如何进行日期范围生成、频率调整、移位操作,并探讨了时间序列的向下和向上采样。
摘要由CSDN通过智能技术生成

一、时间戳索引DatetimeIndex

生成20个DatetimeIndex

from datetime import datetime

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

dates

20190406170618123009.png

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

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

ts

20190406170618155234.png

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

ts + ts[::2]

20190406170618169881.png

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

ts.index.dtype

20190406170618204059.png

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

stamp =ts.index[0]

stamp

20190406170618215777.png

二、索引、选择

1. 索引

ts是一个series;

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

stamp =ts.index[2]

ts[stamp]

20190406170618225542.png

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

20190406170618246048.png

2. 选择

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

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

longer_ts

20190406170618256790.png

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

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

20190406170618268508.png

选择2019年的所有数据

longer_ts[‘2019‘]

20190406170618279249.png

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

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

20190406170618293897.png

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

20190406170618304638.png

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

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

20190406170618328074.png

以上操作也都适用于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

20190406170618338816.png

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

dup_ts.index.is_unique

20190406170618348581.png

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

20190406170618358346.png

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

20190406170618369087.png

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

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

1. 生成日期范围

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

index

20190406170618381782.png

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

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

20190406170618395453.png

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

20190406170618409124.png

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

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

20190406170618421818.png

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

20190406170618433536.png

20190406170618587823.png

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

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

20190406170618702074.png

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

20190406170618713792.png

2. 频率和日期偏置

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

from pandas.tseries.offsets import Hour,Minute

hour = Hour()

hour

20190406170618724533.png

four_hours = Hour(4)

four_hours

20190406170618745040.png

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

20190406170618765546.png

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

20190406170618777264.png

月中某星期的日期week of month

例子:每月第三个星期五

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

list(rng)

20190406170618788982.png

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

20190406170618800700.png

ts.shift(2)

20190406170618811442.png

ts.shift(-2)

20190406170618831948.png

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

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

20190406170618842690.png

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

20190406170618863196.png

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

20190406170618874914.png

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

from pandas.tseries.offsets import Day,MonthEnd

now = datetime.now()

now

20190406170618885656.png

now + 3 * Day()

20190406170618896397.png

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

now + MonthEnd()

20190406170618915927.png

now + MonthEnd(2)

20190406170618937410.png

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

offset = MonthEnd()

offset.rollforward(now)

20190406170618957917.png

offset.rollback(now)

20190406170618977447.png

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

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

ts

20190406170618998930.png

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

20190406170619013577.png

resample可以得到同样的结果

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

20190406170619034084.png

四、时区处理

待用到时候再添加

五、时间区间和区间算术

1. 区间频率转换

2. 季度区间频率

3. 将时间戳转换为区间

4. 从数组生成PeriodIndex

六、重新采样与频率转换

1. 向下采样

2. 向上采样与插值

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

七、移动窗口函数

1. 指数加权函数

2. 二元移动窗口函数

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值