天天看點

Pandas進階教程之:時間處理

​​簡介​​

​​時間分類​​

​​timestamp​​

datetimeindex

date_range 和 bdate_range

`origin`

格式化

​​period​​

​​dateoffset​​

​​作為index​​

切片和完全比對

​​時間序列的操作​​

shifting

頻率轉換

​​resampling 重新取樣​​

簡介

時間應該是在資料進行中經常會用到的一種資料類型,除了numpy中datetime64 和 timedelta64 這兩種資料類型之外,pandas 還整合了其他python庫比如 ​<code>​scikits.timeseries​</code>​ 中的功能。

時間分類

pandas中有四種時間類型:

date times : 日期和時間,可以帶時區。和标準庫中的 ​<code>​datetime.datetime​</code>​ 類似。

time deltas: 絕對持續時間,和 标準庫中的 ​<code>​datetime.timedelta​</code>​ 類似。

time spans: 由時間點及其關聯的頻率定義的時間跨度。

date offsets:基于月曆計算的時間 和 dateutil.relativedelta.relativedelta 類似。

我們用一張表來表示:

<col>

類型

标量class

數組class

pandas資料類型

主要建立方法

date times

​<code>​timestamp​</code>​

​<code>​datetimeindex​</code>​

​<code>​datetime64[ns]​</code>​ or ​<code>​datetime64[ns, tz]​</code>​

​<code>​to_datetime​</code>​ or ​<code>​date_range​</code>​

time deltas

​<code>​timedelta​</code>​

​<code>​timedeltaindex​</code>​

​<code>​timedelta64[ns]​</code>​

​<code>​to_timedelta​</code>​ or ​<code>​timedelta_range​</code>​

time spans

​<code>​period​</code>​

​<code>​periodindex​</code>​

​<code>​period[freq]​</code>​

​<code>​period​</code>​ or ​<code>​period_range​</code>​

date offsets

​<code>​dateoffset​</code>​

​<code>​none​</code>​

看一個使用的例子:

看一下上面資料類型的空值:

timestamp

timestamp 是最基礎的時間類型,我們可以這樣建立:

timestamp 作為index會自動被轉換為datetimeindex:

還可以使用 date_range 來建立datetimeindex:

​<code>​date_range​</code>​ 是月曆範圍,​<code>​bdate_range​</code>​ 是工作日範圍:

兩個方法都可以帶上 ​<code>​start​</code>​, ​<code>​end​</code>​, 和 ​<code>​periods​</code>​參數。

使用 ​<code>​origin​</code>​參數,可以修改 ​<code>​datetimeindex​</code>​ 的起點:

預設情況下 ​<code>​origin='unix'​</code>​, 也就是起點是 ​<code>​1970-01-01 00:00:00​</code>​.

使用format參數可以對時間進行格式化:

period

period 表示的是一個時間跨度,通常和freq一起使用:

period可以直接進行運算:

注意,period隻有具有相同的freq才能進行算數運算。包括 offsets 和 timedelta

period作為index可以自動被轉換為periodindex:

可以通過 pd.period_range 方法來建立 periodindex:

還可以通過periodindex直接建立:

dateoffset

dateoffset表示的是頻率對象。它和timedelta很類似,表示的是一個持續時間,但是有特殊的月曆規則。比如timedelta一天肯定是24小時,而在 dateoffset中根據夏令時的不同,一天可能會有23,24或者25小時。

dateoffsets 和frequency 運算是先關的,看一下可用的date offset 和它相關聯的 frequency:

date offset

frequency string

描述

none

通用的offset 類

​<code>​bday​</code>​ or ​<code>​businessday​</code>​

​<code>​'b'​</code>​

工作日

​<code>​cday​</code>​ or ​<code>​custombusinessday​</code>​

​<code>​'c'​</code>​

自定義的工作日

​<code>​week​</code>​

​<code>​'w'​</code>​

一周

​<code>​weekofmonth​</code>​

​<code>​'wom'​</code>​

每個月的第幾周的第幾天

​<code>​lastweekofmonth​</code>​

​<code>​'lwom'​</code>​

每個月最後一周的第幾天

​<code>​monthend​</code>​

​<code>​'m'​</code>​

月曆月末

monthbegin

​<code>​'ms'​</code>​

月曆月初

​<code>​bmonthend​</code>​ or ​<code>​businessmonthend​</code>​

​<code>​'bm'​</code>​

營業月底

​<code>​bmonthbegin​</code>​ or ​<code>​businessmonthbegin​</code>​

​<code>​'bms'​</code>​

營業月初

​<code>​cbmonthend​</code>​ or ​<code>​custombusinessmonthend​</code>​

​<code>​'cbm'​</code>​

自定義營業月底

​<code>​cbmonthbegin​</code>​ or ​<code>​custombusinessmonthbegin​</code>​

​<code>​'cbms'​</code>​

自定義營業月初

​<code>​semimonthend​</code>​

​<code>​'sm'​</code>​

月曆月末的第15天

​<code>​semimonthbegin​</code>​

​<code>​'sms'​</code>​

月曆月初的第15天

​<code>​quarterend​</code>​

​<code>​'q'​</code>​

月曆季末

​<code>​quarterbegin​</code>​

​<code>​'qs'​</code>​

月曆季初

​<code>​bquarterend​</code>​

​<code>​'bq​</code>​

工作季末

​<code>​bquarterbegin​</code>​

​<code>​'bqs'​</code>​

工作季初

​<code>​fy5253quarter​</code>​

​<code>​'req'​</code>​

零售季( 52-53 week)

​<code>​yearend​</code>​

​<code>​'a'​</code>​

月曆年末

​<code>​yearbegin​</code>​

​<code>​'as'​</code>​ or ​<code>​'bys'​</code>​

月曆年初

​<code>​byearend​</code>​

​<code>​'ba'​</code>​

營業年末

​<code>​byearbegin​</code>​

​<code>​'bas'​</code>​

營業年初

​<code>​fy5253​</code>​

​<code>​'re'​</code>​

零售年 (aka 52-53 week)

​<code>​easter​</code>​

複活節假期

​<code>​businesshour​</code>​

​<code>​'bh'​</code>​

business hour

​<code>​custombusinesshour​</code>​

​<code>​'cbh'​</code>​

custom business hour

​<code>​day​</code>​

​<code>​'d'​</code>​

一天的絕對時間

​<code>​hour​</code>​

​<code>​'h'​</code>​

一小時

​<code>​minute​</code>​

​<code>​'t'​</code>​ or ​<code>​'min'​</code>​

一分鐘

​<code>​second​</code>​

​<code>​'s'​</code>​

一秒鐘

​<code>​milli​</code>​

​<code>​'l'​</code>​ or ​<code>​'ms'​</code>​

一微妙

​<code>​micro​</code>​

​<code>​'u'​</code>​ or ​<code>​'us'​</code>​

一毫秒

​<code>​nano​</code>​

​<code>​'n'​</code>​

一納秒

dateoffset還有兩個方法 ​<code>​rollforward()​</code>​ 和 ​<code>​rollback()​</code>​ 可以将時間進行移動:

上面的操作會自動儲存小時,分鐘等資訊,如果想要設定為 00:00:00 , 可以調用normalize() 方法:

作為index

時間可以作為index,并且作為index的時候會有一些很友善的特性。

可以直接使用時間來擷取相應的資料:

擷取全年的資料:

擷取某個月的資料:

df可以接受時間作為loc的參數:

時間切片:

考慮下面的一個精度為分的series對象:

時間精度小于分的話,傳回的是一個series對象:

時間精度大于分的話,傳回的是一個常量:

同樣的,如果精度為秒的話,小于秒會傳回一個對象,等于秒會傳回常量值。

時間序列的操作

使用shift方法可以讓 time series 進行相應的移動:

通過指定 freq , 可以設定shift的方式:

時間序列可以通過調用 asfreq 的方法轉換其頻率:

asfreq還可以指定修改頻率過後的填充方法:

resampling 重新取樣

給定的時間序列可以通過調用resample方法來重新取樣:

resample 可以接受各類統計方法,比如: ​<code>​sum​</code>​, ​<code>​mean​</code>​, ​<code>​std​</code>​, ​<code>​sem​</code>​, ​<code>​max​</code>​, ​<code>​min​</code>​, ​<code>​median​</code>​, ​<code>​first​</code>​, ​<code>​last​</code>​, ​<code>​ohlc​</code>​。

歡迎關注我的公衆号:「程式那些事」,懂技術,更懂你!