时间序列基础
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)
锚定偏置可以使用rollforward和rollback分别显示地将日期向前或向后“滚动”;
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. 用户自定义的移动窗口函数
以上是关于时间序列基础的主要内容,如果未能解决你的问题,请参考以下文章