前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >时间序列的操作

时间序列的操作

作者头像
慕白
发布2020-01-02 13:43:27
1.2K0
发布2020-01-02 13:43:27
举报

时间序列的操作

一、时间序列基础

代码语言:javascript
复制
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
from datetime import datetime
t1 = datetime(2009,10,20)       # 创建时间序列
date_list = [                   # 创建时间序列数组
    datetime(2016,9,1),
    datetime(2016,9,10),
    datetime(2017,9,1),
    datetime(2017,9,20),
    datetime(2017,10,1)
]

s1 = Series(np.random.rand(5), index=date_list)  # 将时间序列当索引创建series

访问数组的方法:

位置index、datatime对象访问、月份、年份

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

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

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

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

按天产生数据

从2016-01-01开始的100天的时间数据 pd.date_range('2016-01-01', periods=100)

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

按周产生数据

pd.date_range('2016-01-01', periods=100, freq='w')

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

如果想在按周分隔的时候指定从周几开始,例如周一,则: pd.date_range('2016-01-01', periods=100, freq='w-mon')

按小时产生数据

pd.date_range('2016-01-01', periods=100, freq='h') pd.date_range('2016-01-01', periods=100, freq='5h') # 每隔五小时

123

pd.date_range('2016-01-01', periods=100, freq='h')pd.date_range('2016-01-01', periods=100, freq='5h')  # 每隔五小时

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

用个这种方法生成index为时间序列的series

date_list_new = pd.date_range('2016-01-01', periods=100, freq='5H') s2 = Series(np.random.rand(100), index=date_list_new)

123

date_list_new = pd.date_range('2016-01-01', periods=100, freq='5H')s2 = Series(np.random.rand(100), index=date_list_new)

二、时间序列采样

生成数据

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

t_range = pd.date_range('2016-01-01', '2016-12-31') s1 = Series(np.random.randn(len(t_range)), index=t_range)

123

t_range = pd.date_range('2016-01-01', '2016-12-31')s1 = Series(np.random.randn(len(t_range)), index=t_range)

采样

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

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

s1['2016-01'] s1['2016-01'].mean() # 算月平均值

123

s1['2016-01']s1['2016-01'].mean()   # 算月平均值

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

s1_month = s1.resample('M').mean()

12

s1_month = s1.resample('M').mean()

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

bfill和ffill

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

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

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,然后向其中填充整形随机数,模拟两个公司的股价:

stock_df = DataFrame(index=t_range) stock_df['BABA'] = np.random.randint(80, 160, size=len(t_range)) stock_df['TENCENT'] = np.random.randint(30, 50, size=len(t_range))

1234

stock_df = DataFrame(index=t_range)stock_df['BABA'] = np.random.randint(80, 160, size=len(t_range))stock_df['TENCENT'] = np.random.randint(30, 50, size=len(t_range))

使用plot()方法可以生成一个图像的对象,想要显示出图像还需要导入一些绘图的库。

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

将之前的数据按周采样,保存在新的dataframe中:

weekly_df = DataFrame() weekly_df['BABA'] = stock_df['BABA'].resample('W').mean() weekly_df['TENCENT'] = stock_df['TENCENT'].resample('W').mean() weekly_df.plot() plt.show()

123456

weekly_df = DataFrame()weekly_df['BABA'] = stock_df['BABA'].resample('W').mean()weekly_df['TENCENT'] = stock_df['TENCENT'].resample('W').mean()weekly_df.plot()plt.show()

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 时间序列的操作
    • 一、时间序列基础
      • 访问数组的方法:
      • 产生一定范围内的时间数据
      • 按天产生数据
      • 按周产生数据
      • 按小时产生数据
      • 用个这种方法生成index为时间序列的series
    • 二、时间序列采样
      • 生成数据
      • 采样
      • bfill和ffill
    • 三、时间序列画图
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档