【Python3】bitbank.cc APIより取得したビットコインのチャートデータをPostgreSQLに保存する①
ざっくりと。
まず、取得した辞書データ
{'high': '489000', 'sell': '443000', 'buy': '439000', 'last': '441000', 'timestamp': 1505830555602, 'low': '425000', 'vol': '29.1356'}
値の型を確認
for t in dict.values(): print(type(t)) <class 'str'> <class 'str'> <class 'str'> <class 'str'> <class 'int'> <class 'str'> <class 'str'> #timestampだけint型。その他はstr型。
timestampはUTCでデータベースに保存したい。 現在、unixtimeなので、UTCに変換する。 下記ブログを参考にしました
Python 3 で少しだけ便利になった datetime の新機能 - Qiita
from datetime import datetime utc = datetime.utcfromtimestamp(dict['timestamp']) utc --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-62-df88e9c4d9de> in <module>() 1 from datetime import datetime ----> 2 utc = datetime.utcfromtimestamp(dict['timestamp']) 3 utc ValueError: year is out of range
エラーが出た。よく見ると数字の桁数が多い?
unixtimeの詳細について以下記事が参考になりました。
今は秒数部分は10桁で表すらしい。
エラーの原因としては小数点が打たれてないことが問題っぽい。
整数型で位置を指定して小数点を追加する方法がわからなかったので、一度文字列型にして小数点を追加する
timestamp = str(dict['timestamp']) a = timestamp[:10] print(a) b = timestamp[10:] print(b) c = "." dict['timestamp'] = a + c + b print(dict['timestamp']) print(type(dict['timestamp'])) 1505830555 602 1505830555.602 <class 'str'>
できた。文字列だとUTCに変換できないので、浮動小数点に変換し、挿入する。
from datetime import datetime dict['timestamp']= float(dict['timestamp']) dict['timestamp'] = datetime.utcfromtimestamp(dict['timestamp']) print(dict['timestamp']) print(type(dict['timestamp'])) 2017-09-19 14:15:55.602000 <class 'datetime.datetime'>
UTC時間だから日本時間-9時間の値が出てくる。
データ型はdatetime.datetimeでした。
あとは、残りの辞書データを浮動小数点に変換する。(for文ですべて変換してからtimestampをいじればよかったのだが、最初にやってしまったので1つ1つやる)
dict['high'] = float(dict['high']) dict['sell'] = float(dict['sell']) dict['buy'] = float(dict['buy']) dict['last'] = float(dict['last']) dict['low'] = float(dict['low']) dict['vol'] = float(dict['vol']) for t in dict.values(): print(type(t)) print(dict) <class 'float'> <class 'float'> <class 'float'> <class 'float'> <class 'datetime.datetime'> <class 'float'> <class 'float'> {'high': 489000.0, 'sell': 443000.0, 'buy': 439000.0, 'last': 441000.0, 'timestamp': datetime.datetime(2017, 9, 19, 14, 15, 55, 602000), 'low': 425000.0, 'vol': 29.1356}
無事、timestamp以外floatになりました。