添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
(13)Python初入坑之时间序列基础内容

(13)Python初入坑之时间序列基础内容

本节介绍python的关于时间序列的基础内容。

一、时间序列的基础内容

在金融和经济学领域python已经承担起了很多任务,这得益于pandas对于时间序列的良好支持。现在在金融和数据分析的重要性正在强劲增长,金融和经济领域中实时分析也逐渐兴起,无论是出于监管还是投资决策还是金融产品的定价等等,这一切都离不开对于时间序列的分析。

pandas可以高效的处理非常大的时间序列。

首先我们熟悉一下python标准库中处理日期和时间的datetime模块。

datatime包中有很多模块,有date模块,time模块,datetime模块等等,我们从中引入datetime模块。datetime.now() 是返回当前的时间。2018年4月20日,20点,3分,54秒,339461微秒。

那我们也可以取出now的年月日。

如果我们想要知道两个日期之间的相隔时间,可以直接用两个时间相减。例如:

使用datetime将两个时间相减,2018年4月20日,减去2018年3月20日10点,得到一个timedelta数值,也就是时长数值,30天,50400秒。我们还能用days,seconds将天数和秒数单独取出来。

如果我们要给现有的时间加减某一个时长,需要再引入timedelta模块。

给2017年8月24日加上30天,得出的时间就是9月23日。

有的时候,日期是被保存成字符串的,关于日期在字符串和数值之间的转换,我们来探究一下。

把一个datetime型数据改变成字符串,可以采用以下几种方法:

通过str方法,把theday改变从一个精确到秒的字符串,这样可以统一输出成这种格式。

或者使用strftime函数进行变换。后面需要定义输出的格式,可以自由安排年月日的位置,大写Y则表示4位数格式的年份,小写y则只输出2位数。

那怎么把一个时间样式的字符串改变成时间的数值类型呢?使用strptime函数。

但是如果在pandas中,时间的解析就非常智能了。pandas可以使用to_datetime解析时间。

输出一个时间,则会识别成时间戳的格式。

如果输入一个列表,则会输出成一个index类型。数据类型是datetime64[ns]纳秒,是numpy类型。freq是指的时间间隔,我们后面会讲。

可以看出,to_datetime默认是按照月,日,年的格式识别。那如果我们要识别成2017年10月1日呢?也就是识别的时候需要按照日,月,年的格式识别。我们需要添加限定参数,dayfirst=True。

同时,中间的符号可以多样,/ - . 都可以,to_datetime都可以识别。

如何生成datetimeindex。

如何生成时间序列呢,我们下面做一个示范。

使用date_range() 可以生成连续的时间序列,填入起始时间和结束时间,以天为间隔。

我们也可以只输入起始时间或者结束时间,然后使用periods确定时间的时长。起始时间使用start表明。freq='D'就是指,间隔为天。

当然我们也可以使用结束时间end= 来表示结束之前多少天。

freq不设置的话,就会默认是D,即天。我们也可以单独设置freq的格式。

BM是指的每个月的最后一个工作日,则2017.01.01-2017.12.01就按照每个月的最后一个工作日隔开。“BM”代表business end of month。例如H是hour,M是month,D是day,A是year,也可以使用其他的值。

如果我们要以每个月的倒数第三个工作日进行分隔,可以像下面这样加上timedelta进行限定。定义好了index之后,减去timedelta(2)即可。

timedelta默认是天数,然后是秒数,如timedelta(2,10)是2天10秒,timedelta(2,36000)是2天10个小时。

上面的data_range都是默认某一天的0点0分,我们也可以细化到小时,分钟和秒。

这样时间就会细化到秒,那如果我们要忽略掉小时分钟和秒,只保留年月日呢,可以用normalize=True。

下面我们生成一个以时间序列作为索引的Series。

序列是时间序列,在计算的时候,也会自动对齐。

例如ts,和ts每两个取一个进行相加,匹配到了则求和,未匹配到则返回空值。关于[::2]是取Series中,每两个取一个,即隔一个取一个,切片的知识可以查看廖雪峰慕课网python入门的8-1节进行回顾。

时间序列的切片和索引

我们先创建一个时间序列索引的Series。然后进行取值。

然后可以用不同的格式取值,pandas可以自动识别。

比如我们还可以取2017年的所有数据,或者2017年某个月的数据。

也可以用和list切片的方法一样,取某阶段的值。

以上我们都是截取时间戳,即时间点,我们也可以截取一个时长,比如一年,这个时候就需要用period来进行分隔。例如下面,我们就截取2017年,分隔频率为每年的12月份,A为年,DEC为12月,所以p+2就是2019年的12月了。

那我们除了用daterange()来生成时间序列,也可以用period_range来生成时期序列。如下:

生成了时期序列,用月份隔开,每个都是单独的一个月,不是一个时间点。我们可以对比一些date_range。date_range则生成的是时间点。

编辑于 2018-04-20 21:58

文章被以下专栏收录