时间序列的操作

创建数据


创建一个包含datetime类型的series
时间序列的操作

时间序列操作


访问values

通过位置信息进行访问

时间序列的操作

通过index数据类型访问

时间序列的操作

通过指定index值访问

将index的值作为字符串指定访问也是可以的:

时间序列的操作

注意,这里还使用了s1[‘20171001’]这种形式,即没有指定分隔符,也是可以的。

最后一种情况,如果没有指定具体日,即指定了年和月,将返回这一月的所有日的值。注意,这种情况就不能写成201709这种格式的了,否则会报错。

依次类推,指定年s1[‘2017’]将返回这一年的所有数据
时间序列的操作

产生一定范围内的时间数据

pandas.date_range()可以产生一定时间范围内的时间数据,具体参数如下:

  • start:起始时间
  • end:结束时间
  • periods:时间间隔
  • freq:步长,默认为D,表示按天为步长

这里有一个特殊的地方,如果指定了start和end,则periods是不需要指定的,而若只指定了start和periods,则可以根据这两个自动算出end。就是说end和periods不用共存。

按天产生数据

从2016-01-01开始的100天的时间数据:
时间序列的操作

可以看出,它是DatetimeIndex类型数据,从2016-01-01开始,间隔一天,一共100天的数据.

按周产生数据

如果是想按一周为间隔,则:
时间序列的操作

发现开始的日期并不是2016-01-01,因为按周分隔的话默认是从周日开始的,而2016-01-03是第一个周日,所以从这一天开始

如果想在按周分隔的时候指定从周几开始,例如周一,则:
时间序列的操作

按小时产生数据

时间序列的操作

这样就从指定日期的0点开始,每小时产生一个数据,直到100个。

H的单位为1小时,如果想指定n小时为间隔,则freq=nH即可,例如5小时为间隔:
时间序列的操作

有了这种产生时间序列的方法,就可以同个这种方法生成index为时间序列的series
时间序列的操作

时间序列采样和画图


生成数据

首先使用date_range来生成一个时间序列,然后在生成一个和它一样长的series:
时间序列的操作

采样

采样的方法和标准有很多,假设这里采用按月份采样的方法,即每个月的数据作为一个数据点,一共是12个数据点。

1月为例:通过s1['2017-01']可以得到所有1月的数据,现在需要将它们变成一个数据点,可以采用求平均数的方法mean()。用这个方法重复对1到12月求平均数,创建一个新的series就得到了采样后的数据。

pandas对于时间序列的采样提供了一种更为便利的方法:resample,它可以指定采样的标准(按天、月等)。
时间序列的操作

这里指定按月采样,并求平均值得到采样解果。结果的index为每月最后一天的日期。

bfill和ffill

这是resample的两个方法,用于数据的填充。

当采样频率提高之后,可能导致原始数据不够,例如s1是按照“日”为单位进行排列的,如果按照小时进行采样的话必然不能采,所以可以使用bfillffill对数据进行填充。

bfill是向上填充,即将2017-01-01 01:00:00至2017-01-01 23:00:00的值都填充为2017-01-02 00:00:00的值
时间序列的操作

ffill是向下填充,即将2017-01-01 01:00:00至2017-01-01 23:00:00的值都填充为2017-01-01 00:00:00的值
时间序列的操作

画图

时间序列数据适合画基于时间的曲线图,这里画一个模拟的股票数据曲线图:

首先,创建一个每小时一个点的时间序列:
时间序列的操作

注意这个序列的长度,后面要用

然后先创建一个index为这个时间序列的空的dataframe:
时间序列的操作

然后向其中填充整形随机数,模拟两个公司的股价:
时间序列的操作

使用plot()方法可以生成一个图像的对象:
时间序列的操作

想要显示出图像还需要导入一些绘图的库:
时间序列的操作

图形就画出来的

但是看到这个图可读性是为0的,因为8000+的数据挤在一起形成的折线图显得不好看,所以采用前面采样的方法进行数据预处理,改成每个周一个点

将之前的数据按周采样,保存在新的dataframe中:
时间序列的操作

重新绘图:
时间序列的操作

现在看上去好多了