目錄
8.1datetime模塊
8.1.1datetime的構造
8.1.2資料轉換
8.2時間序列基礎
8.2.1時間序列構造
8.2.2索引與切片
8.3日期
8.3.1日期范圍
8.3.2頻率與移動
?8.4時期
8.4.1時期基礎
8.4.2頻率轉換
8.4.3時期資料轉換
8.5頻率轉換與重采樣
8.5.1重采樣
8.5.2降采樣
?8.5.3升采樣
8.6綜合示例-自行車租賃資料
8.6.1資料來源
8.6.2定義問題
8.6.3資料清洗
8.6.4資料探索
在許多行業中,時間序列資料是一種重要的結構化資料型別,本章主要講解datetime的資料型別及字串的想換轉換方法;時間序列的構造和使用放啊;日期和時期資料的使用方法;時間序列的頻率轉換與重采樣,最后通過一個案例,講解時間序列資料的處理與分析方法,
8.1datetime模塊
本節將講解Python標準庫中的datetime庫的使用方法,以及datetime庫的資料和字串資料的轉換方法,
8.1.1datetime的構造
Python的標準庫datetime可用于創建時間資料型別,如下表所示為datetime庫的時間資料型別,
| 型別 | 使用說明 |
| date | 日期(年月日) |
| time | 時間(時分秒毫秒) |
| datetime | 日期和時間 |
| timedelta | 兩個datetime的差(日秒毫秒) |
其中date類資料可用于創建日期類資料,通過年、月、日來進行存盤,如下圖

time類資料用于存盤時間資料,通過時、分、秒、毫秒進行存盤,如下圖

datetime類資料可以看做時date類和time類的組合,通過now方法可以查看當前的時間,如下圖

timedelta類資料為兩個datetime類資料的差,也可以通過daetime類物件加或減去timedelta類物件,以此獲取新的datetime類物件,如下圖

8.1.2資料轉換
在資料分析中,字串和datetime類資料需要進行轉換,通過str方法可以直接將datetime類資料轉換為字串

如果需要將datetime類資料轉換為特定格式的字串資料(格式化),需要使用strftime方法,如下圖

下表所示為部分格式化編碼
| 代碼 | 使用說明 |
| %Y | 4位數的年 |
| %y | 2位數的年 |
| %m | 2位數的月 |
| %d | 2位數的填 |
| %H | 時(24小時制) |
| %I | 時(12小時制) |
| %M | 2位數的分 |
| %W | 每年的第幾周,星期一為每周第一天 |
通過datetime.strptime方法可將字串格式轉換為datetime資料型別,如下圖

在pandas中,可通過to_datetime方法將一列字串資料轉換為時間資料,以前面章節的示例為例,可以看出HireDate欄位的資料型別為字串

通過to_datetime方法可以將HireDate欄位進行轉換,如下圖,該資料為TimeStamp (時間戳)

8.2時間序列基礎
時間序列是以時間戳為索引的Series或DataFrame,本節將講解時間序列的構造方法,以及時間序列的索引和切片
8.2.1時間序列構造
pandas中的時間序列指的是以時間資料為索引的Series或DataFrame,如下圖,為創建一個時間序列的Series

創建的這個時間序列Series的索引為DatetimeIndex物件,如下圖
而DatetimeIndex物件的每個標量值是pandas的Timestamo物件,如下圖,該物件以保存頻率資訊,后面會 講解其用途,

跟普通的series一樣,不同索引的時間序列的算數運算會按照索引對齊,如下圖

8.2.2索引與切片
時間序列的索參考法和pandas基礎資料型別的用法是一樣的,如下圖

傳入一個可用于解釋的日期字串,同樣也可以完成索引作業,這是一種比較方便的用法,如下圖

切片的使用方法和pandas基礎資料用法也是一樣的,如下圖所示

同樣的傳入日期字串或者datetime類資料也可以完成切片,由于大部分時間序列資料是按照時間先后順序進行排序的,如果索引值不在該時間序列中也可以實作切片,如下圖

對于長時間序列來說,可以通過年、月來輕松獲取時間序列的切片,如下圖


注:時間序列的DataFrame的索引和切片使用方法同上面一樣,不再贅述,
對于具有重復索引的時間序列,可通過索引的is_unique屬性進行檢查,如下圖

對重復索引的時間序列進行索引時,產生的是切片,如下圖

這樣可通過groupby函式對其進行聚合,如下圖

8.3日期
本節將講解如何生成指定長度的DatetimeIndex,時間序列中的基礎頻率及如何移動時間資料,
8.3.1日期范圍
使用pd.date_range函式可以創建指定長度的DatetimeIndex索引,如下圖

如下圖,默認情況下,產生的DatetimeIndex索引的間隔為天,也就是說,時間頻率是填,通過freq引數可以使用其他頻率,如下圖

在pd.date_range函式中傳入起始或者結束如期,在傳入一個表示一段時間的資料,就可以創建指定長度的DatetimeIndex索引,如下圖

默認情況下,pd.date_range函式會保留完整的時間資訊,但可以通過normalize引數使其規范化,如下圖所示

8.3.2頻率與移動
時間序列的頻率由基礎頻率和日期偏移量組成,例如,通過4H就可以創建4個小時為頻率的DatetimeIndex索引,如下圖

更為復雜的頻率字串,也可以被搞笑決議為相對應的頻率,如下圖

時間序列的常用基礎頻率如下表
| 別名 | 使用說明 |
| D | 每日歷日 |
| B | 每作業日 |
| H | 每小時 |
| S | 每秒 |
| T或者min | 每分鐘 |
| M | 每月最后一個日歷日 |
| BM | 每月最后一個作業日 |
| A-JAN、A-EFB | 每年指定月份的最后一個日歷日 |
移動資料就是沿著時間索引將資料向前或者向后移動,通過shift方法可以完成移動資料的操作,如下圖

這種單純的移動不會修改索引,而是使部分資料被丟棄,如果在shift方法中傳入引數,這樣就是修改索引了,如下圖

8.4時期
時期表示的時間區間,如數日,數月和數年等,本節將講解時期的構造方法、時期資料的頻率轉換和其資料結構
8.4.1時期基礎
Period可以創建時期資料型別,傳入字串或者整數、頻率即可,如下圖,下圖中的Period物件表示從2018年1也1日到2018年12月31日之間的整段時間,

該Period物件可以進行加減計算,使其進行時間的品阿姨,兩個Period物件如果由相同的頻率,則他們的差為他們之間的單位數量,

類似于pd.date_range,pd.period_range函式可以創建時期范圍,PeriodIndex索引同樣可以構Series或DataFrame資料

8.4.2頻率轉換
Period和PeriodIndex物件可以通過asfreq方法轉換頻率,如下圖所示將年度時期轉換為月度時期

當年度的頻率不是位于12月時,轉換頻率就會發生變化,如下圖

PeriodIndex物件的頻率轉換方式也一樣,如下圖

8.4.3時期資料轉換
利用to_period方法可以將由時間戳索引的時間序列資料轉換為時期為索引,如下圖

當然,也可以指定轉換的頻率,如圖所示

通過to_timestamp方法可進行逆操作,如下圖

8.5頻率轉換與重采樣
重采樣時時間序列頻率轉換的處理程序,高頻率聚合到低頻率成為降采樣,而低頻率轉換為高頻率為高采樣,
8.5.1重采樣
pandas中的resample方法用于各種頻率的轉換作業,如下圖所示為將間隔為’天‘的頻率轉換為間隔為’月度‘的頻率,這里的聚合方法為平均值,

如下表所示為resample方法的引數及說明,具體使用方法后面會詳細解說
| 引數 | 使用說明 |
| freq | 轉換頻率 |
| axies=0 | 重采樣的軸 |
| closed=’right | 在降采樣中,設定各時間段哪端是閉合的 |
| label=‘right’ | 在降采樣中,如何設定聚合值的標簽 |
| loffset=None | 設定時間偏移量 |
| kind=None | 聚合到時期或時間戳,默認為時間序列得索引型別 |
| convention=None | 升采樣所采用得約定(start或end),默認為end |
8.5.2降采樣
在降采樣中,重點需要考慮得是closed和label引數,這兩個引數分別表示哪邊區間是閉合的,哪邊用于標記,如圖所示為將兩個引數值都設定為right

如下圖所示將closed和label引數值均設為left,大家可以思考一下這兩個引數的變化帶來的影響,多看兩遍就可以掌握了,其實很簡單,

通過設定loffset日期偏移量,也可以看出其時間戳所屬的區間,如下圖,紅色的是未來改版的警告資訊,大家按照他那個寫法改改就好,
8.5.3升采樣
在升采樣中用到的就不再是聚合,而是需要對缺失值進行填充,其填充方法與前面介紹的fillna一樣,如下圖所示,也可以設定填充的個數,


8.6綜合示例-自行車租賃資料
8.6.1資料來源
該案例使用的資料及可在Kaggle(https://www.kaggle.com/c/bike/-sharing-demand/data)網站中下載,這里下載訓練集,
資料說明:datetime為租賃時間:season為季節,1為春季,2為夏季以此類推:holiday表示是否為假期:0為非假期,1為假期:workingday與holday值正好相反,0為非作業日,1為作業日:weather為天氣情況,數字越大,天氣越差;temp和atemp為氣溫;humidity為濕度;windspeed為風俗;casual為普通用戶;registered為注冊用戶;count為租賃自行車數量,讀取檔案如下:

8.6.2定義問題
本次分析圍繞時間提出問題:時間段與自行車租賃的關系情況
8.6.3資料清洗
查看缺失值,如下圖可以看出沒有缺失值,

然后查看各欄位資料型別,發現datetime欄位不是時間資料型別,如下圖

此時利用pd.to_datetime函式將其轉換為datetime類資料,如下圖

最后將datetime欄位設定為DataFrame的索引,這樣就成為了時間序列資料,如下圖

8.6.4資料探索
首先利用groupby方法也可以進行降采樣,這里降采樣到年份資料,如下圖可以看出,2012年的租賃要高于2011年

然后通過下面的代碼繪制柱狀圖:


接著再利用resample方法,將資料重采樣到月份,型別為時期型別,如下圖

然后利用plot方法繪制時間序列圖,如下圖由圖可知,2011年和2012年去世大致相同,前幾個月增加,到了5、6月達到峰值,再到9月份減少


為了分析每天和每小時的租賃分布情況,對日(day)和時(hour)的資料進行單獨存盤如下圖

然后對day欄位進行分組統計,如下圖

注意:訓練資料只有前19天
進行可視化


同樣的,在對hour欄位和weather欄位進行上述處理,這里不再展示,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/305329.html
標籤:python
上一篇:SpringBoot成長記11:SpringBoot完結總結
下一篇:簡歷撰寫:6大板塊&n個細節
