pandas時間序列常用方法簡介
導讀
pandas是Python數(shù)據(jù)分析最好用的第三方庫,沒有之一。——笛卡兒沒說過這句話!
在進行時間相關的數(shù)據(jù)分析時,時間序列的處理是自然而然的事情,從創(chuàng)建、格式轉(zhuǎn)換到篩選、重采樣和聚合統(tǒng)計,pandas都提供了全套方法支持,用的熟練簡直是異常絲滑。

pandas時間序列創(chuàng)建最為常用的有以下2種方式:
pd.date_range(),創(chuàng)建指定日期范圍,start、end和periods三個參數(shù)任意指定2個即可,另有頻率、開閉端點、時區(qū)等參數(shù)可選
pd.Timestamp(),時間戳對象,從其首字母大寫的命名方式可以看出這是pandas中的一個類,實際上相當于Python標準庫中的datetime的定位,在創(chuàng)建時間對象時可接受日期字符串、時間戳數(shù)值或分別指定年月日時分秒等參數(shù)三類,僅能生成單一時間點。其優(yōu)點是Timestamp類提供了豐富的時間處理接口,如日期加減、屬性提取等

與二者類似,pandas還提供了pd.period和pd.period_range兩個方法,分別用于創(chuàng)建單個時期和時期序列。這里時期是一段時間,而date或timestamp則是一個時間點。
實際應用中,與時間格式相互轉(zhuǎn)換最多的應該就是字符串格式了,這也是最為常用也最為經(jīng)典的時間轉(zhuǎn)換需求,pandas中自然也帶有這一功能:
pd.to_datetime:字符串轉(zhuǎn)時間格式
dt.astype(str):時間提取字符串
其中,pd.to_datetime可接受單個或多個日期數(shù)值,具體類型包括數(shù)值型、字符串、數(shù)組或pd.series等序列,其中字符串日期格式幾乎包含了所有可能的組成形式,例如"年/月/日","月/日/年"和"月-日-年"等形式,字符串轉(zhuǎn)換日期也是實際應用中最為常見的需求。反之,對于日期格式轉(zhuǎn)換為相應的字符串形式,pandas則提供了時間格式的"dt"屬性,類似于pandas為字符串類型提供了str屬性及相應方法,時間格式的"dt"屬性也支持大量豐富的接口。例如dt.date可提取日期,dt.time則可提取時間。
需要指出,時間序列在pandas.dataframe數(shù)據(jù)結(jié)構(gòu)中,當該時間序列是索引時,則可直接調(diào)用相應的屬性;若該時間序列是dataframe中的一列時,則需先調(diào)用dt屬性再調(diào)用接口。舉例如下:
1.首先創(chuàng)建數(shù)據(jù)結(jié)構(gòu)如下,其中初始dataframe索引是時間序列,兩列數(shù)據(jù)分別為數(shù)值型和字符串型



處理時間序列的另一個常用需求是篩選指定范圍的數(shù)據(jù),例如選取特定時段、特定日期等。實現(xiàn)這一目的,個人較為常用的有3種方法:
索引模糊匹配,這實際上算是pandas索引訪問的一個通用策略,所以自然在時間篩選中也適用
truncate,截斷函數(shù),通過接受before和after參數(shù),實現(xiàn)篩選特定范圍內(nèi)的數(shù)據(jù),其中兩個參數(shù)中可有一個缺省,表示半開區(qū)間
dt.between,也是借助時間序列的dt屬性,接受起始和結(jié)束參數(shù),實現(xiàn)特定范圍篩選

以這一數(shù)據(jù)作為示例,其中索引時間序列,需求是篩選出上午7點-9點間的記錄,則3種實現(xiàn)方式分別示例如下:






關于pandas時間序列的重采樣,再補充兩點:1.重采樣函數(shù)可以和groupby分組聚合函數(shù)組合使用,可實現(xiàn)更為精細的功能,具體可參考Pandas中g(shù)roupby的這些用法你都知道嗎一文;2.重采樣過程中,無論是上采樣還是下采樣,其采樣結(jié)果范圍是輸入記錄中的最小值和最大值覆蓋的范圍,所以當輸入序列中為兩段不連續(xù)的時間序列記錄時,可能會出現(xiàn)中間大量不需要的結(jié)果(筆者親歷天坑),同時在上圖中也可發(fā)現(xiàn)從4小時上采樣為2小時后時間最大范圍是20:00,而非22:00,也是這個原因。
理解pandas中時間序列滑動窗口的最好方式是類比SQL中的窗口函數(shù)。實際上,其與分組聚合函數(shù)的聯(lián)系和SQL中的窗口函數(shù)與分組聚合聯(lián)系是一致的。常用的滑動窗口函數(shù)主要有3個:
shift,向前或向后取值
diff,向前或向后去差值
rolling,一段滑動窗口內(nèi)聚合取值



值得指出,這里的滑動取值可以這樣理解:periods參數(shù)為正數(shù)時,可以想象成索引列不動,數(shù)據(jù)列向后滑動;反之,periods參數(shù)為負數(shù)時,索引列不動,數(shù)據(jù)列向前滑動。進一步的,當freq參數(shù)為None時,則僅僅是滑動指定數(shù)目的記錄,而不管索引實際取值;而當freq設置有效參數(shù)時,此時要求索引列必須為時間序列,并根據(jù)時間序列滑動到指定周期處,并從此處開始取值(在上圖中,體現(xiàn)為10T之前的記錄不再保留)。





相關閱讀:
