4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pandas DataFrameで日時データのタイムゾーン変換する際のエラーと解決方法

Posted at

今回は、以下のPandas DataFrameデータがある前提で説明します。

test.py

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に直したいことです。
使おうとしているコード(関数)は以下です。

test.py
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を時間にしました。

test.py
res = res.set_index('time')
res.index = pd.to_datetime(res.index)

##エラーその2
ただし、ここでもう一度下記のコマンドで変換しようとしたら、違うエラーメッセージが出ました。
どうやら元々の数値にタイムゾーンの情報がないから、変換できないということですね。

test.py
res.index = res.index.tz_convert('Asia/Tokyo')

TypeError: Cannot convert tz-naive timestamps, use tz_localize to localize

そこで、まず、indexにある時間のデータをタイムゾーンの情報を付加してからもう一度変換することを試しました。

test.py
res.index = res.index.tz_localize('UTC') #タイムゾーンの情報を付加する

見事に変換できました!

test.py
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

4
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?