Python で解析 21
“Advent Calendar 2013 - Python で解析!” の二十一日目。DatetimeIndex
今回は DatetimeIndex について。
1. データの生成
DatetimeIndex を生成するには、 date_range を使う。試しに DatetimeIndex を使った DataFrame を生成してみる。
In [1]: import pandas as pd In [2]: df1 = pd.DataFrame({ ...: 'value': range(18), ...: }, index=pd.date_range('2012/9/1', '2013/8/31', freq='3W')) In [3]: df1 Out[3]: value 2012-09-02 0 2012-09-23 1 2012-10-14 2 2012-11-04 3 2012-11-25 4 2012-12-16 5 2013-01-06 6 2013-01-27 7 2013-02-17 8 2013-03-10 9 2013-03-31 10 2013-04-21 11 2013-05-12 12 2013-06-02 13 2013-06-23 14 2013-07-14 15 2013-08-04 16 2013-08-25 17
2. date_range の説明
date_range だけを実行してみると、次のようになる。
In [4]: pd.date_range('2012/9/1', '2013/8/31', freq='3W') Out[4]: <class 'pandas.tseries.index.DatetimeIndex'> [2012-09-02 00:00:00, ..., 2013-08-25 00:00:00] Length: 18, Freq: 3W-SUN, Timezone: None
DatetimeIndex が返って来る。指定するのは開始、終了、頻度で、上の例だと 2012/9/1 から 2013/8/31 までの範囲で三週間毎の Timestamp 生成を指定していることになる。 freq は省略可能。
In [5]: pd.date_range('2012/9/1', '2013/8/31') Out[5]: <class 'pandas.tseries.index.DatetimeIndex'> [2012-09-01 00:00:00, ..., 2013-08-31 00:00:00] Length: 365, Freq: D, Timezone: None
省略時は 'D' (日毎) の Timestamp が生成されることが Length が 365 になっていることから分かる。freq には週毎 'W'、時間毎 'H'、 12 時間毎 '12H' …などなど、いろいろ指定でき、月末日 'BM' なんかも便利そうだ。
タイムゾーンも指定できる。
In [6]: pd.date_range('2012/9/1', '2013/8/31', tz='Asia/Tokyo')[0] Out[6]: Timestamp('2012-09-01 00:00:00+0900', tz='Asia/Tokyo')
3. 便利なフィルター
DatetimeIndex を使うと、こんなことができる。
In [7]: df1['2012'] Out[7]: value 2012-09-02 0 2012-09-23 1 2012-10-14 2 2012-11-04 3 2012-11-25 4 2012-12-16 5
最初に作った DataFrame 中から 2012 年のものだけを抽出できた。 2013 年分も同様に抽出できるし、ある月のものを抽出することも簡単だ。
In [8]: df1['2013-03'] Out[8]: value 2013-03-10 9 2013-03-31 10
"date >= '2013/3/1' and date < '2013/4/1'" のような条件文を書かなくていいのは、なかなか便利だ。
今回はこんなところで。