pandas.DataFrame.resampleを使用して価格を異なるタイムフレームの足へ変換する

入力データのCSVは下記のようなもの。

Time Open High Low Close
2016/9/7 6:10 102.022 102.042 101.022 101.542
2016/9/7 6:11 102.019 102.046 101.019 102.046

・・・・・・・・

それをまずは次のようにしてDataFrameに格納。

filename = "USDJPY.csv"
df = pd.read_csv(filename,
                   sep=',',
                   parse_dates=True,
                   float_precision = "high")
print df

print結果は下記。

Time Open High Low Close
0 2016/9/7 6:10 102.022 102.042 101.022 101.542
1 2016/9/7 6:11 102.019 102.046 101.019 102.046
・・・・・・・・・・

続いて下記でresampleして時間足に変換しようとしたがエラー。

x=df.resample('H').ohlc()

エラー内容は下記。
pandas.DataFrame.resample.pyで止まった。

「'Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex'」ということなので、DataFrameのインデックスをDatetimeIndexに置き換える。

その部分のコードは下記。
※この処理には、非常に時間がかかる。出来ることなら入力データを事前にDatetimeIndexへ変更しておきたいが、可能なのかどうかは未調査。

#IndexをdateTimeIndexに変換
dateTimeIndex = pd.DatetimeIndex(df['Time'])
df.index = dateTimeIndex
print df

print出力結果は下記。

Time Open High Low Close
2016-09-07 06:10:00 2016/9/7 6:10 102.022 102.042 101.022 101.542
2016-09-07 06:11:00 2016/9/7 6:11 102.019 102.046 101.019 102.046
・・・・・・・・

IndexとTimeという列が重複して非常に無駄なことをしているように思えるが、いったん気にしないでおく・・・。

最後にresampleを実行する。
例えば、2016年9月7日のデータに関して、1時間足を得るために次のコードを実行。

ohlcDataFrame = df["2016/09/07"].resample("H")

実行結果は下記。

Open High Low Close
2016-09-07 06:00:00 102.056471 102.080221 101.056471 102.080134
2016-09-07 07:00:00 102.098426 102.118429 101.098426 102.118429
2016-09-07 08:00:00 101.810564 101.830572 100.810564 101.830572
2016-09-07 09:00:00 101.541465 101.561465 100.541465 101.561465
・・・・・・

データを確認すると、想定していた結果と異なった。
下記仕様となっているようだ。想定通りに出力できるかは未調査。

【想定】
・例えば、06:00:00の1時間足のOpenは、1分足のデータのうち、06:00:00に最も近い値が採用される。
・例えば、06:00:00の1時間足のCloseは、1分足のデータの内、07:00:00に最も近い値が採用される。
・例えば、06:00:00の1時間足のHighは、1分足のデータの06:00:00〜06:59:59のデータの内、最も大きなものが採用される。
・例えば、06:00:00の1時間足のLowは、1分足のデータの06:00:00〜06:59:59のデータの内、最も小さなものが採用される。

【実際】
・06:00:00の1時間足のOpenは、1分足のデータのうち、6時台のOpenの平均が計算されて採用される。
・06:00:00の1時間足のCloseは、1分足のデータのうち、6時台のCloseの平均が計算されて採用される。
・06:00:00の1時間足のHighは、1分足のデータのうち、6時台のHighの平均が計算されて採用される。
・06:00:00の1時間足のLowは、1分足のデータのうち、6時台のLowの平均が計算されて採用される。