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'" のような条件文を書かなくていいのは、なかなか便利だ。

今回はこんなところで。