pandas处理时间序列(1)

微信公众号: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: 表示上一步的输出结果





微信扫一扫

关注该公众号

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348