微信公众号:Python学习派
Pandas works with time series
Python最常用的数据处理方面的库非pandas莫属,它是在金融建模的背景下发展起来的,因此包含相当广泛和使用的工具来处理dates, times和time-indexed数据。这里我们将了解一下几种:
Time stamps(时间戳)表示一个特定的时间,比如2018,12,1 at 9:00 am
Time intervals(时间间隔)、periods(周期)表示一个开始和结束时间之间的特定长度,其中periods经常用来表示一定长度的时间,比如一天24小时
Time deltas(时间增量)、durations(期间)表示一个具体的时间长度,比如1小时
Date time and dateuil
在使用pandas之前,我们先简单看一下python的内置data time模块以及第三方dateuil模块对于时间的处理[1]。
1from datatime import datatime
2datatime(year = 2015, month = 7, day = 4)
3>>> out: datetime.datetime(2015, 7, 4, 0, 0)
1from dateutil import parser
2date = parser.parse("4th of July, 2015")
3date
4>>> out: datetime.datetime(2015, 7, 4, 0, 0)
5# 输出day of week
6date.strftime('%A')
7>>> out: 'Saturday'
对于标准的字符串格式代码,你可以参考https://docs.python.org/3/library/datetime.html
NumPy's datetime64
datetime和dateutil的强大之处在于它们的灵活性和简单的语法:我们可以可以使用这些对象及其内置方法轻松执行感兴趣的几乎任何操作。它们所不擅长的地方是使用大型数组的日期和时间。因此对于这方面的缺陷,NnmPy的datetime64则有所弥补,datetime64要求一个具体的输入格式,比如:
1import numpy as np
2date = np.array('2018-12-01', dtype = np.datetime64)
3date
4>>> out: array('2018-12-01', dtype='datetime64[D]')
这里我们同样也可以vectorized operations:
1date + np.arange(3)
2>>> out: array(['2018-12-01', '2018-12-02', '2018-12-03'], dtype='datetime64[D]')
很显然,正因为其名字为datetime64,其精度也被限制在64位,因此最多为时间存储单元的倍。下面列出一部分的时间跨度:
code Meaning Time span(absolute)
Y Year [9.2e18 BC, 9.2e18 AD]
M Month [7.6e17 BC, 7.6e17 AD]
W Week [1.7e17 BC, 1.7e17 AD]
更多的信息可以参考https://docs.scipy.org/doc/numpy/reference/arrays.datetime.html
虽然datetime64数据类型解决了内置Python日期时间类型的一些缺点,但它缺少datetime提供的许多方便的方法和函数,尤其是dateutil。
Pandas
下面终于到了我们的重头戏,既然内置的模块或多或少都有一些不足,那么pandas则很好的将它们的优点结合起来,形成了一个强大的处理时间序列数据的工具。
先来看一些简单的例子:
1import pandas as pd
2date = pd.to_datetime('4th of July, 2015')
3date
4>>> out: Timestamp('2015-07-04 00:00:00')
5date.strftime('%A')
6>>> out: 'Saturday'
7date + pd.to_timedelta(np.arange(3), 'D')
8>>> out: DatetimeIndex(['2015-07-04', '2015-07-05', '2015-07-06'], dtype='datetime64[ns]', freq=None)
很明显,它已经做到了综合datetime, dateuil以及datetime64的优点。
Index by time
从上面的例子中我们可以看到,pandas对于时间的处理是以timestamps作为index的,请看下面的例子:
1index = pd.DatetimeIndex(['2018-1-1', '2018-2-1', '2018-3-1', '2018-4-1'])
2data = pd.Series([0, 1, 2, 3], index = index)
3data
4>>> out: 2018-01-01 0
52018-02-01 1
62018-03-01 2
72018-04-01 3
8dtype: int64
9# 使用index
10data['2018-1-1':'2018-3-1']
11>>> out: 2018-01-01 0
122018-02-01 1
132018-03-01 2
14dtype: int64
15# 更进一步的
16data['2018']
17>>> out: 2018-01-01 0
182018-02-01 1
192018-03-01 2
202018-04-01 3
21dtype: int64
Pandas time series data structures
最开始我们已经介绍了一些常用的时间格式,对于这些pandas都提供了相应的处理方式,来看一些简单的例子:
1dates = pd.to_datetime([datetime(2018, 12, 1), '2th of Dec, 2018', '2018-Dec-3', '04-12-2018', '20181205'])
2dates
3>>> out: DatetimeIndex(['2018-12-01', '2018-12-02', '2018-12-03', '2018-04-12',
4 '2018-12-05'],
5 dtype='datetime64[ns]', freq=None)
6#将DatetimeIndex转化为PeriodIndex
7dates.to_period('D')
8>>> out: PeriodIndex(['2018-12-01', '2018-12-02', '2018-12-03', '2018-04-12',
9 '2018-12-05'],
10 dtype='period[D]', freq='D')
11#timedelta操作
12dates - dates[0]
13>>> out: TimedeltaIndex(['0 days', '1 days', '2 days', '-233 days', '4 days'], dtype='timedelta64[ns]', freq=None)
在numpy中,我们有各种各样构建随机序列、顺序序列的方法,在pandas中对于时间序列来说也有同样的操作。
1pd.date_range('2018-12-1', '2018-12-7')
2>>> out: DatetimeIndex(['2018-12-01', '2018-12-02', '2018-12-03', '2018-12-04',
3 '2018-12-05', '2018-12-06', '2018-12-07'],
4 dtype='datetime64[ns]', freq='D')
5# 也可以这样
6pd.date_range('2018-12-1', periods = 7)
7>>> out: DatetimeIndex(['2018-12-01', '2018-12-02', '2018-12-03', '2018-12-04',
8 '2018-12-05', '2018-12-06', '2018-12-07'],
9 dtype='datetime64[ns]', freq='D')
10#同时你还可以通过更改freq来表示不同的间隔,其中Y表示year,M表示month,D表示day以此类推
11pd.date_range('2018-12-1', periods = 7, freq = 'H')
12>>> out: DatetimeIndex(['2018-12-01 00:00:00', '2018-12-01 01:00:00',
13 '2018-12-01 02:00:00', '2018-12-01 03:00:00',
14 '2018-12-01 04:00:00', '2018-12-01 05:00:00',
15 '2018-12-01 06:00:00'],
16 dtype='datetime64[ns]', freq='H')
关于pandas对于时间序列的处理就先介绍到这了,更加深入的学习请移步第二篇Pandas处理时间序列数据(2)
[1]: >>> out: 表示上一步的输出结果
微信扫一扫
关注该公众号