CHANyoshiのブログ

初心者プログラマーです。

【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桁で表すらしい。

UNIXTIME - 日付・時刻の徹底解説

エラーの原因としては小数点が打たれてないことが問題っぽい。
整数型で位置を指定して小数点を追加する方法がわからなかったので、一度文字列型にして小数点を追加する

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になりました。