Pythonでの時系列データの扱い2 〜 時系列データの作成および選択

Pythonでの時系列データの扱い1 〜 文字列とdatetimeの変換」の続き。

◎pandas.Seriesによる時系列データの作成および操作

pandas.Seriesのindexオプションに、datetime.datetimeで作成したdatetime型データのリストを指定して時系列データを作成すると、pandasがDatetimeIndex型の時系列データを作成してくれる

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import datetime
import dateutil

#################### TimeSeries ####################
# 日付インデックスを作成
dates = [
    datetime.datetime(2011, 1, 2),
    datetime.datetime(2011, 1, 5),
    datetime.datetime(2011, 1, 7),
    datetime.datetime(2011, 1, 8),
    datetime.datetime(2011, 1, 10),
    datetime.datetime(2011, 1, 12),
]

# indexを先程作成したdatesに設定した、時系列データを作成
ts = pd.Series(np.random.randn(6), index = dates)
print ts
print ts.index
print ts.index.dtype
print ts.index[0],ts[0]

出力結果は次の通り。

◎print ts実行
2011-01-02 0.085009
2011-01-05 2.289721
2011-01-07 -1.888826
2011-01-08 0.234620
2011-01-10 -0.519038
2011-01-12 -0.002832
dtype: float64

◎print ts.index実行
DatetimeIndex(['2011-01-02', '2011-01-05', '2011-01-07', '2011-01-08',
'2011-01-10', '2011-01-12'],
dtype='datetime64[ns]', freq=None)

◎print ts.index.dtype実行
datetime64[ns]

◎print ts.index[0],ts[0]実行
2011-01-02 00:00:00 -1.19647229903

開始日付と期間を指定して時系列データを作成することも可能。
また、作成した時系列データから特定データを取得する方法も色々ある。

#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import datetime
import dateutil

# データの作成開始日付と期間を指定して時系列データを作成する
longer_ts = pd.Series(np.random.randn(1000),index=pd.date_range('1/1/2000', periods=1000))
# 年が一致するものを検索する
print longer_ts['2001']

# 年月が一致するものを検索
print longer_ts['2001-05']

# 取得開始日をdatetimeで指定して、それ以降のデータを取得する
print longer_ts[datetime.datetime(2001,5,7):]

# データの開始日付と終了日付を指定してデータを取得する
print longer_ts['1/6/2011':'1/11/2011'] #存在しない場合は何も戻らない
print longer_ts['5/6/2001':'5/11/2001']

実行結果は次のようになる。

# 年が一致するものを検索する print longer_ts['2001']
2001-01-01 -1.009395
2001-01-02 0.485400
2001-01-03 0.258303
2001-01-04 -0.239185
2001-01-05 0.047044
2001-01-06 -1.316472
...
2001-12-25 -0.388155
2001-12-26 -0.769968
2001-12-27 0.736896
2001-12-28 -1.241676
2001-12-29 0.085019
2001-12-30 -0.816814
2001-12-31 -0.984648

# 年月が一致するものを検索する print longer_ts['2001-05']
2001-05-01 -0.200811
2001-05-02 0.312867
2001-05-03 -0.316903
2001-05-04 -1.238628
2001-05-05 -0.030432
2001-05-06 -0.983215
2001-05-07 0.789857
2001-05-08 0.723744
2001-05-09 -1.053328
2001-05-10 -0.662608
2001-05-11 0.114421
2001-05-12 -0.606446
2001-05-13 1.713556
2001-05-14 0.716952
2001-05-15 -0.912648
2001-05-16 0.288324
2001-05-17 1.769182


# 取得開始日をdatetimeで指定して、それ以降のデータを取得する print longer_ts[datetime.datetime(2001,5,7):]
2001-05-07 0.789857
2001-05-08 0.723744
2001-05-09 -1.053328
2001-05-10 -0.662608
・・・・・・・

# データの開始日付と終了日付を指定してデータを取得する print longer_ts['1/6/2011':'1/11/2011']

Series([], Freq: D, dtype: float64)
※)存在しない場合は何も戻らない

# データの開始日付と終了日付を指定してデータを取得する print longer_ts['5/6/2001':'5/11/2001']
2001-05-06 -0.983215
2001-05-07 0.789857
2001-05-08 0.723744
2001-05-09 -1.053328
2001-05-10 -0.662608
2001-05-11 0.114421
Freq: D, dtype: float64

◎pandas.DataFrameによる時系列データの作成および操作
ここまでpandas.Seriesに対して実施したことは、pandas.DataFrameでも実施できる。

###### pandas.DataFrameによる時系列データ作成 ######
longer_df = pd.DataFrame(
    np.random.randn(1000, 4), #1000行の4列の行列を作成する(4要素持つベクトルを1000個作る)
    index=pd.date_range('1/1/2000', periods=1000),
    columns=['Open', 'High', 'Low', 'Close']
)

# 年が一致するものを検索する
print longer_df['2001']

# 年月が一致するものを検索
print longer_df['2001-05']

# 取得開始日をdatetimeで指定して、それ以降のデータを取得する
print longer_df[datetime.datetime(2001,5,7):]

結果は次。

# 年が一致するものを検索する print longer_df['2001']
Open High Low Close
2001-01-01 0.226610 -2.021651 0.894285 -1.332273
2001-01-02 -0.159398 0.974963 1.479195 0.855358
2001-01-03 0.084935 -0.669278 1.188965 0.844677
2001-01-04 -0.602863 2.210382 -1.199838 1.820582
・・・・・・・・・・・

# 年月が一致するものを検索 print longer_df['2001-05']
Open High Low Close
2001-05-01 -0.226392 -1.049307 -0.977490 -1.247701
2001-05-02 -0.902493 1.163422 0.038032 0.120781
2001-05-03 -0.430098 -1.867330 0.977169 -0.092192
2001-05-04 -0.866856 -0.095946 0.481190 0.507765
2001-05-05 0.144516 0.975847 1.105147 1.139388
2001-05-06 -1.679432 -1.370770 -0.606025 -1.600749
2001-05-07 0.664228 1.189631 1.053774 -0.852818
2001-05-08 -0.867117 0.135239 1.080369 -0.220236
・・・・・・・・・・・

# 取得開始日をdatetimeで指定して、それ以降のデータを取得する print longer_df[datetime.datetime(2001,5,7):]
Open High Low Close
2001-05-07 0.664228 1.189631 1.053774 -0.852818
2001-05-08 -0.867117 0.135239 1.080369 -0.220236
2001-05-09 1.241876 1.362839 -0.618486 1.275841
2001-05-10 -1.343650 -0.811789 -2.136463 -0.274356
2001-05-11 0.571775 -1.788212 -1.626962 -0.317792
2001-05-12 0.145999 -0.128796 -0.440639 -1.052569
・・・・・・・・・・・

以上。

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理