微信公眾號:Python學(xué)習(xí)派
Pandas works with time series
Python最常用的數(shù)據(jù)處理方面的庫非pandas莫屬盅称,它是在金融建模的背景下發(fā)展起來的缩膝,因此包含相當(dāng)廣泛和使用的工具來處理dates, times和time-indexed數(shù)據(jù)疾层。這里我們將了解一下幾種:
Time stamps(時間戳)表示一個特定的時間贡避,比如2018,12,1 at 9:00 am
Time intervals(時間間隔)刮吧、periods(周期)表示一個開始和結(jié)束時間之間的特定長度,其中periods經(jīng)常用來表示一定長度的時間井厌,比如一天24小時
Time deltas(時間增量)旗笔、durations(期間)表示一個具體的時間長度,比如1小時
Date time and dateuil
在使用pandas之前拳魁,我們先簡單看一下python的內(nèi)置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'
對于標(biāo)準(zhǔn)的字符串格式代碼贿衍,你可以參考https://docs.python.org/3/library/datetime.html
NumPy's datetime64
datetime和dateutil的強大之處在于它們的靈活性和簡單的語法:我們可以可以使用這些對象及其內(nèi)置方法輕松執(zhí)行感興趣的幾乎任何操作贸辈。它們所不擅長的地方是使用大型數(shù)組的日期和時間擎淤。因此對于這方面的缺陷,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數(shù)據(jù)類型解決了內(nèi)置Python日期時間類型的一些缺點,但它缺少datetime提供的許多方便的方法和函數(shù)卦洽,尤其是dateutil阀蒂。
Pandas
下面終于到了我們的重頭戲,既然內(nèi)置的模塊或多或少都有一些不足酗失,那么pandas則很好的將它們的優(yōu)點結(jié)合起來昧绣,形成了一個強大的處理時間序列數(shù)據(jù)的工具夜畴。
先來看一些簡單的例子:
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)
很明顯贪绘,它已經(jīng)做到了綜合datetime, dateuil以及datetime64的優(yōu)點。
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# 更進(jìn)一步的
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
最開始我們已經(jīng)介紹了一些常用的時間格式坯认,對于這些pandas都提供了相應(yīng)的處理方式,來看一些簡單的例子:
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轉(zhuǎn)化為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中陋气,我們有各種各樣構(gòu)建隨機(jī)序列巩趁、順序序列的方法淳附,在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')
關(guān)于pandas對于時間序列的處理就先介紹到這了炉菲,更加深入的學(xué)習(xí)請移步第二篇Pandas處理時間序列數(shù)據(jù)(2)
[1]: >>> out: 表示上一步的輸出結(jié)果
微信掃一掃
關(guān)注該公眾號