【时间序列分析】S04E01如何基于python进行时间的表示

0.本集概览

1.时间序列分析概述
2.原生工具:datetime和dateutil
3.Numpy中的日期时间表示
4.pandas的时间日期表示

1.时间序列分析概述

第四季,我们介绍一个新的话题:时间序列分析。时间序列分析在金融、气象、交通、宏观经济等诸多领域的应用可以说是非常的广泛。简单点说,时间序列就是在各个时间点上形成的数值序列,而分析的过程就是通过这些数值序列去研究其自身的变化规律。

时间序列通常使用pandas中的series结构(一个时间点对应一个数值数据)或者dataframe结构(一个时间点对应多个数值数据)来表示,和之前介绍过的series和dataframe结构本质上是一样的,唯一一个重要的不同就是,他的索引数据是时间类型的。

时间类型的数据作为一种特殊的数据形式,和一般的数值类型或者字符串类型相比,要多了不少的讲究。因此在这一小节,我们专门来介绍如何在python中对日期和时间的进行表示,这也是后续时间序列分析的基础。

我们先从python标准库与第三方库入手,介绍其中的日期、时间、时间增量和时间跨度的表示工具。当然了,说实话其实pandas中提供的时间序列工具更适合用来进行相关问题的处理,但是我想从标准库入手,可以帮助我们去搞清楚整个问题的来龙去脉,对我们更好的理解问题和使用工具将大有裨益。

2.原生工具:datetime和dateutil

首先,我们第一个要介绍的就是python中的原生工具:datetimedateutil

datetime是python中的标准库,最基本的日期和时间功能都包含在其中了。而dateutil是一个强大的第三方库,如果将二者搭配进行使用,可以收到奇效,方便快捷的解决诸多问题。

2.1.日期的创建

首先我们来利用datetime类型来创建一个日期。

代码片段:

from datetime import datetime

date = datetime(year=2019, month=5, day=2)
print(date)

运行结果:

2019-05-02 00:00:00

这样我们就成功的生成了第一个日期类型的对象了。

2.2.文本日期的自动解析

这里有同学一定会问了,我们用来进行datetime对象初始化的参数一般都是从数据源(数据表格、网站)上获取的文本形式的日期类数据,一般情况下会有很多种不同的写法,比如,2019年5月2日,常见的就可以写成:2019-5-25/2/2019,等等,种类非常繁多,那我们如何将他们转换成datetime初始化所需要的年月日标准形式呢?

不用着急,其实这个工作都不需要我们自己动手去做,我们刚刚提到过的第三方库dateutil就能够帮我们实现这一切,他能够对绝大多数字符串格式的日期进行正确的解析,从而帮助我们正确的生成datetime数据类型,我们就试试上面列举的:2019-5-25/2/20192019/5/2这几种日期表达方式的解析。

代码片段:

from datetime import datetime
from dateutil import parser

sdate1 = '2019-5-2'
sdate2 = '5/2/2019'
sdate3 = '2019/5/2'

date1 = parser.parse(sdate1)
date2 = parser.parse(sdate2)
date3 = parser.parse(sdate3)

print(date1)
print(date2)
print(date3)

运行结果:

2019-05-02 00:00:00
2019-05-02 00:00:00
2019-05-02 00:00:00

从程序运行的结果来看,我们利用dateutil工具对几种常见的日期类型字符串做了转换,得到了正确的结果,这个会在许多应用场景中提高我们的工作效率。

2.3.提取日期中的要素信息

首先我们来看看一个经常用到的案例:获取当前日期时间的用法。
代码片段:

from datetime import datetime
from dateutil import parser

date = datetime.now()
print(date)

运行结果:

2019-05-02 12:23:42.571834

这时,我们再来思考一下,这里程序最终输出的格式是2019-05-02 12:23:42.571834,存在着两方面的问题:

第一是:输出的是千篇一律的固定统一格式;
第二是:都到了秒以后的微秒级的时间精度了。

这就带来了一些问题:有些信息我们可能用不到,比如说微秒信息,而有些信息我们想要的却没有,比如说星期几。那么,如果我们想要定制一条时间信息,比如说要将当前的时间显示成:2019年5月2日,星期四,12点39分12秒这种格式?该如何进行处理?其实这是非常容易的。
代码片段:

from datetime import datetime
from dateutil import parser

print(datetime.now())
print(datetime.now().strftime("DATE:%Y-%m-%d %A TIME:%H:%M:%S"))

运行结果:

2019-05-02 12:39:12.958049
DATE:2019-05-02 Thursday TIME:12:39:12

在这里,我们就通过标准字符串格式代码:%Y 年、%M 月、%D 日、%A 周几、%H 时、%M 分、%S 秒,来提取datetime数据类型中的对应关键信息,然后通过strftime方法,转换成我们定制的任意格式的日期信息的字符串。

3.Numpy中的日期时间表示

3.1.datetime64与向量化运算

datetime类型和所有原生python数据类型一样(比如说列表),就功能而言都是非常全的,但是如果处理的数据量比较大,那么速度就会比较慢。这个对比python的原生列表和numpy中的ndarray对象就知道了。实际上,在numpy中也有被编码的日期类型数组,相比于原生类型datetime,他的性能也要更优一些。

为了解决python原生日期类型在性能方面的弱点,numpy中增加了自己的时间日期数据类型:datetime64,顾名思义就是将日期编码成64位的整数,这样就可以让日期数组非常的紧凑,提升向量运算的效率。

正如我们在numpy的章节里讲过的那样,想实现上述的功能,就要在初始化array数组的时候,显式的确定数据的类型为datetime64
代码片段:
```
import numpy as np

date = np.array('2019-05-02', dtype=np.datetime64)

top Created with Sketch.