Pandas 基礎(15) - date_range 和 asfreq


這一節是承接上一節的內容, 依然是基於時間的數據分析, 接下來帶大家理解關於 date_range 的相關用法.

首先, 引入數據文件:

import pandas as pd df = pd.read_csv('/Users/rachel/Sites/pandas/py/pandas/15_ts_date_range/aapl_no_dates.csv') df.head() 

輸出:

這個文件的數據跟上一節用到的數據是一模一樣的(大家可以對照一下), 只是時間列被去掉了. 這樣設計是因為我們要引出下面要學到的函數 date_range(), 我們可以通過這個函數把缺少的時間列補上.

設定一個時間范圍:

rng = pd.date_range(start='6/1/2017', end='6/30/2017', freq='B') rng 

輸出:

DatetimeIndex(['2017-06-01', '2017-06-02', '2017-06-05', '2017-06-06', '2017-06-07', '2017-06-08', '2017-06-09', '2017-06-12', '2017-06-13', '2017-06-14', '2017-06-15', '2017-06-16', '2017-06-19', '2017-06-20', '2017-06-21', '2017-06-22', '2017-06-23', '2017-06-26', '2017-06-27', '2017-06-28', '2017-06-29', '2017-06-30'], dtype='datetime64[ns]', freq='B') 

這里對 date_range() 函數一共設置了 3個參數, 前兩個很好理解, 分別是開始時間, 結束時間, 最后一個 freq 是關於連續性的設定, 它有幾種選擇, B 的意思是 business, 也就是只取工作日, 大家可以根據輸出結果, 對照着日歷看下, 剛好就是省略了周末. 

那下面就可以把上面得到的日期序列設為我們數據的索引列, 這個很簡答了, 是 pandas 的基礎操作:

df.set_index(rng, inplace=True) 

輸出: 

現在我們的數據表完整了, 有了時間列索引, 我們就可以輕松對數據做很多分析操作了:

求曲線圖:

%matplotlib inline df.Close.plot() 

輸出:

求6月1日到6月10日的數據:

df['2017-6-1':'2017-6-10'] 

輸出:

求6月1日到6月10日的閉市數據的平均值:

df['2017-6-1':'2017-6-10'].Close.mean() 

輸出:

153.7642857142857 

再介紹 date_range() 的另一種設置時間范圍的方法:
設置一個時間序列, 參數說明:
start: 起始日期
periods: 從起始值開始向后順延的數據條數, 單位取決於第三個數 freq
freq: 連續的方式, B 表示只取工作日

rng = pd.date_range(start='1/1/2017', periods=72, freq='B') rng 

輸出:

DatetimeIndex(['2017-01-02', '2017-01-03', '2017-01-04', '2017-01-05', '2017-01-06', '2017-01-09', '2017-01-10', '2017-01-11', '2017-01-12', '2017-01-13', '2017-01-16', '2017-01-17', '2017-01-18', '2017-01-19', '2017-01-20', '2017-01-23', '2017-01-24', '2017-01-25', '2017-01-26', '2017-01-27', '2017-01-30', '2017-01-31', '2017-02-01', '2017-02-02', '2017-02-03', '2017-02-06', '2017-02-07', '2017-02-08', '2017-02-09', '2017-02-10', '2017-02-13', '2017-02-14', '2017-02-15', '2017-02-16', '2017-02-17', '2017-02-20', '2017-02-21', '2017-02-22', '2017-02-23', '2017-02-24', '2017-02-27', '2017-02-28', '2017-03-01', '2017-03-02', '2017-03-03', '2017-03-06', '2017-03-07', '2017-03-08', '2017-03-09', '2017-03-10', '2017-03-13', '2017-03-14', '2017-03-15', '2017-03-16', '2017-03-17', '2017-03-20', '2017-03-21', '2017-03-22', '2017-03-23', '2017-03-24', '2017-03-27', '2017-03-28', '2017-03-29', '2017-03-30', '2017-03-31', '2017-04-03', '2017-04-04', '2017-04-05', '2017-04-06', '2017-04-07', '2017-04-10', '2017-04-11'], dtype='datetime64[ns]', freq='B') 

這里就得到了從1月2日開始的72個日期, 這其中是跳過了周末的日期之后, 總共加起來是72天.

下面把第三個參數改下, freq=H, 也就是以小時為單位, 從起始開始, 取72小時:

rng = pd.date_range(start='1/1/2017', periods=72, freq='H') rng 

輸出:

DatetimeIndex(['2017-01-01 00:00:00', '2017-01-01 01:00:00', '2017-01-01 02:00:00', '2017-01-01 03:00:00', '2017-01-01 04:00:00', '2017-01-01 05:00:00', '2017-01-01 06:00:00', '2017-01-01 07:00:00', '2017-01-01 08:00:00', '2017-01-01 09:00:00', '2017-01-01 10:00:00', '2017-01-01 11:00:00', '2017-01-01 12:00:00', '2017-01-01 13:00:00', '2017-01-01 14:00:00', '2017-01-01 15:00:00', '2017-01-01 16:00:00', '2017-01-01 17:00:00', '2017-01-01 18:00:00', '2017-01-01 19:00:00', '2017-01-01 20:00:00', '2017-01-01 21:00:00', '2017-01-01 22:00:00', '2017-01-01 23:00:00', '2017-01-02 00:00:00', '2017-01-02 01:00:00', '2017-01-02 02:00:00', '2017-01-02 03:00:00', '2017-01-02 04:00:00', '2017-01-02 05:00:00', '2017-01-02 06:00:00', '2017-01-02 07:00:00', '2017-01-02 08:00:00', '2017-01-02 09:00:00', '2017-01-02 10:00:00', '2017-01-02 11:00:00', '2017-01-02 12:00:00', '2017-01-02 13:00:00', '2017-01-02 14:00:00', '2017-01-02 15:00:00', '2017-01-02 16:00:00', '2017-01-02 17:00:00', '2017-01-02 18:00:00', '2017-01-02 19:00:00', '2017-01-02 20:00:00', '2017-01-02 21:00:00', '2017-01-02 22:00:00', '2017-01-02 23:00:00', '2017-01-03 00:00:00', '2017-01-03 01:00:00', '2017-01-03 02:00:00', '2017-01-03 03:00:00', '2017-01-03 04:00:00', '2017-01-03 05:00:00', '2017-01-03 06:00:00', '2017-01-03 07:00:00', '2017-01-03 08:00:00', '2017-01-03 09:00:00', '2017-01-03 10:00:00', '2017-01-03 11:00:00', '2017-01-03 12:00:00', '2017-01-03 13:00:00', '2017-01-03 14:00:00', '2017-01-03 15:00:00', '2017-01-03 16:00:00', '2017-01-03 17:00:00', '2017-01-03 18:00:00', '2017-01-03 19:00:00', '2017-01-03 20:00:00', '2017-01-03 21:00:00', '2017-01-03 22:00:00', '2017-01-03 23:00:00'], dtype='datetime64[ns]', freq='H') 

上面介紹了關於生成日期序列的函數 date_range() 的用法. 

下面介紹一下日期序列的補充函數 asfreq(). 在上面的例子中, 數據里缺少了周末的數據, 所以如果想要補充這部分數據的話, 可以用下面的方式. 上面的代碼中, 參數 D 表示以"天"為單位, 連續取值:

df.asfreq('D', method='pad') 

輸出:

參數 W 表示以"周"為單位, 連續取值:

df.asfreq('W', method='pad') 

輸出:

參數 H 表示以"小時"為單位, 連續取值:

df.asfreq('H', method='pad') 

輸出:

在 1 到10范圍內取72個隨機數:

import numpy as np np.random.randint(1,10,len(rng)) 

輸出:

array([1, 2, 5, 6, 6, 5, 9, 8, 3, 2, 5, 8, 9, 4, 5, 4, 9, 9, 4, 9, 9, 8, 5, 3, 2, 8, 3, 9, 8, 7, 8, 4, 8, 8, 8, 4, 4, 5, 1, 1, 3, 8, 3, 2, 9, 6, 5, 8, 2, 7, 5, 7, 5, 1, 5, 6, 6, 3, 4, 4, 4, 3, 5, 3, 3, 9, 1, 2, 8, 7, 9, 6]) 

把上面的 72 個數生成一個序列, 以上面的時間序列為索引:

ts=pd.Series(np.random.randint(1,10,len(rng)), index=rng) ts.head(10) 

輸出:

2017-01-01 00:00:00 7 2017-01-01 01:00:00 9 2017-01-01 02:00:00 4 2017-01-01 03:00:00 3 2017-01-01 04:00:00 3 2017-01-01 05:00:00 8 2017-01-01 06:00:00 7 2017-01-01 07:00:00 8 2017-01-01 08:00:00 2 2017-01-01 09:00:00 2 Freq: H, dtype: int64 

以上是關於時間序列的第二小節, 下節會繼續哦, enjoy~~~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM