今回は、以下のPandas DataFrameデータがある前提で説明します。
print(res)
time open high low close volume
0 2019-11-04 03:00:00 108.229 108.23 108.216 108.223 77.0
ここで注意してほしいのは以下2点です。
-
timeの列はあくまで時間の数値として存在しており、タイムゾーンの情報が持っていないこと(実際はUTCを表しています)
-
indexは定義がいておらず、デフォルトの0~nの並びになっていること
そして、今回の目標は、time列の時間をUTCからJSTに直したいことです。
使おうとしているコード(関数)は以下です。
from datetime import datetime, timedelta`
res['time'] = res['time'].tz_convert('Asia/Tokyo')
##エラーその1
まず、そのまま上記のコマンドを実施したところで、以下のエラーメッセージが出力。
要するには、indexのtypeが時間ではないので、変換できないらしいです。
TypeError: index is not a valid DatetimeIndex or PeriodIndex
そこで、下記のコマンドを投入し、元々time列のデータをindex列に移動し、indexのtypeを時間にしました。
res = res.set_index('time')
res.index = pd.to_datetime(res.index)
##エラーその2
ただし、ここでもう一度下記のコマンドで変換しようとしたら、違うエラーメッセージが出ました。
どうやら元々の数値にタイムゾーンの情報がないから、変換できないということですね。
res.index = res.index.tz_convert('Asia/Tokyo')
TypeError: Cannot convert tz-naive timestamps, use tz_localize to localize
そこで、まず、indexにある時間のデータをタイムゾーンの情報を付加してからもう一度変換することを試しました。
res.index = res.index.tz_localize('UTC') #タイムゾーンの情報を付加する
見事に変換できました!
res.index = res.index.tz_convert('Asia/Tokyo')
open high low close volume
time
2019-11-04 12:00:00+09:00 108.229 108.232 108.216 108.228 115.0