上一篇文章中,我們理清楚了time庫以及datetime庫中各種時間對象的處理方法,以及相互之間的轉化方法。
我們發現,time庫以及datetime庫中,確實存在名字相同,但是調用方法與所屬類完全不一樣的情況,這也是造成使用過程中各種混淆的原因。
今天我們把Pandas庫中處理時間的各種函數與方法也加進來討論,當然,由於Pandas中處理時間的方法和類太多太強大,我們僅僅是對其中探討Pandas其中部分,特別是其中與time庫、datetime庫有關聯且又容易混淆的相關知識。
(一) 此Timestamp非彼Timestamp
相信在讀過前面一篇文章的同學,對time庫中的unix時間戳還有印象,但是Pandas中的Timestamp對象和unix時間戳格式完全不同。
Pandas中的Timestamp對象可以說是Pandas中時間序列對象的“細胞”,如果我們有datetime64[ns]型Series對象如下:
你會發現當你提取Series第一個元素出來,返回來的就是一個Timestamp對象。當然,我們也可以自己創建一個Timestamp對象:
從上面的代碼你會發現,你可以將unix時間戳、字符串型日期、datetime庫中datetime.datetime通過pd.Timestamp()方法直接轉化爲Timestamp對象。
反過來呢?如果想將把Timestamp對象轉化爲unix時間戳,可以使用pd.Timestamp.timestamp()方法:
(二) 生成時間序列
Pandas作爲處理多維數組的“神器”,本篇文章講的當然是處理時間序列的方法。其中,Pandas中生成時間序列的方法不少,最常用的方法是pd.date_range(),我們看一下其使用方法:
l pd.date_range(start, end, freq) 生成一個時間段
n start:開始時間,參數可以是datetime庫中的datetime對象,也可以是字符串。
n end:結束時間,參數可以是datetime庫中的datetime對象,也可以是字符串。
n freq:時間頻率,'Y'表示年,'M’表示月,'D’表示天,'H’表示小時,'Min’表示分鐘
注意,這裏開始時間和結束時間的參數指向的對象,是可以是datetime.datetime對象:
當然,這裏的開始時間除了可以使用datetime.datetime實例以外(這裏注意,是使用的datetime庫中的類,而不是Pandas庫),也可以用字符串來表示。
以start_time爲2019年7月17日爲例,start_time也可以是字符串'20190717'、'2019-07-17'、'2019/07/17'...
從上面可以看到,pd.date_range()方法生成的是長度爲200、數據類型爲datetime的DatetimeIndex對象,時間頻率是天。
也就是說,2019年7月17日到2020年2月1日,算上始末的日期,一共200天。這是因爲默認的頻率是每天,freq='D'。 也可以通過改變時間頻率,詳情參考上面的使用方法添加修改freq參數即可。
如果我們想要2019年7月17日爲起始,按照每天的時間頻率,生成長度爲200的DataIndex對象,可以這樣寫:
相應地,如果想要以2020年2月1日爲結束日,按照每天的時間頻率,生成長度爲200的DataIndex對象,可以這樣寫:
(三) .to_datetime()方法
當然,上面的方法生成的是DatetimeIindex對象,可以通過pd.Series()方法轉化爲Series對象:
但是對於不規範的日期字符串Series,需要使用pd.to_datetime()方法來對其進行轉換,比如:
(四) DateOffset類
datetime庫中有timedelta類作爲日期的增減,Pandas中也有專門的DateOffset類作爲時間間隔對象,可以直接作用在上面的datetime型Series對象中。
其使用方法和datetime.timedelta類相似,但是要注意的是裏面的參數名最後都加了's'。
datetime型Series對象可以直接使用DataOfffset對象進行日期加減:
也可以作用在DatetimeIndex對象中:
(五) 時間序列日期格式化
要對datetime型的Series對象進行日期格式轉換,可以通過Series實例的方法.dt.strftime(),其格式化字符串依然可以參照datetime庫中的格式化字符串對照表:
要對datetime型的Series對象進行日期格式轉換,可以通過Series實例的方法.dt.strftime(),其格式化字符串依然可以參照文章開頭的datetime庫中的格式化字符串對照表:
但是如果留心的話可以發現,轉化之後的數據類型,已經從datetime型變成object類,也就是字符串。
如果把字符串時間date_03重新轉化爲datetime型Series,用上面提到的pd.to_datetime()方法即可:
(六) 結後語
time庫和datetime庫以及Pandas中各種對象處理時間的方法,雖然錯綜複雜又相互關聯,但是其實在使用方面有所側重和不同。
time庫以及datetime庫的對象,一般用在程序設計的中涉及到時間的問題,比如爬蟲的時候在獲得的不規則時間時碰到的格式轉換問題,會使用很多。
Pandas中各種與時間相關的類非常多,方法非常豐富,涉及到時間處理的各個方面,主要用作序列數據的處理方面,這和time庫與datetime庫對單獨某些日期數據處理不同。
就數據分析工作而言,對時間序列數據處理的時候Pandas用得非常多,以至於很多人幾乎都忘記time庫與datetime庫的存在。總體而言,對於數據分析初學者而言,可以把Pandas作爲重點學習方面,但是time庫和datetime庫作爲Python標準庫,其時間類的基本使用方法的學習是必不可少的。