3. 비트코인 선물/3-4. 오류 해결

(파이썬) ValueError: invalid literal for int() with base 10 오류 해결

봄이오네 2022. 11. 10. 08:07
반응형
목 차
1. 들어가며
2. 에러 발생 과정
3. 에러 해결 과정
4. 전체 코드 및 결과

5. 마치며

1. 들어가며

바이비트API를 통해 투자가능금액(available balance)와 시간(time_now)를

데이터를 수신/출력하는 과정에서 아래와 같은 오류가 발생하였다.

오류내용은 "int함수는 10진법으로 해석할 수 없다"는 내용이다.

  • 오류 내용 : ValueError: invalid literal for int() with base 10 : '1667643174.736790'

그런데, 오류 내용이 너무 어렵다. @.@

그냥 마이크로 초가 있는 문자형의 유닉스(Unix)시간은 int형이 아닌,

float형으로 먼저 변환해야 한다고 설명하면 될 거 같다.

구체적으로 아래에서 확인해 보자


2. 에러 발생 과정

여기서는 투자가능금액이 아닌, 시간 관련 데이터에 대해 알아보자.

에러는 20줄에서 발생한다.

(소수점을 가진 문자형을 int형으로 바로 받을 수 없다)

 

그림1. int형 에러는 20줄에서 발생한다.


3. 에러 해결 과정

위의 에러는 <그림1>의 20줄에서 오류가 발생한다.

유닉스 시간의 마이크로 초(소수)가 있는 문자형은 int형으로 바꿀 수 없다는 것이다.

 

에러를 해결하는 방법은 문자형에 float형을 먼저 붙여주고, int를 붙여준다.

(마이크로 초를 제거하기 위해서이다)

 

(당초) time_now = int (            resp [ "time_now" ] )

(변경) time_now = int ( float ( resp [ "time_now" ]))


4. 전체 코드 및 결과

from pybit.inverse_perpetual import HTTP
import datetime as dt

with open(r'C:\Users\... api 경로 ') as f:
    lines = f.readlines()
    api_key = lines[0].strip()
    api_secret = lines[1].strip()

def avail_balance(coin_name):

    session = HTTP(
        endpoint="https://api.bybit.com",
        api_key=api_key,
        api_secret=api_secret
        )

    resp = session.get_wallet_balance(coin = coin_name)

    available_balance = resp["result"]["BTC"]["available_balance"]  # str형으로 출력됨
    time_now = int(float(resp["time_now"]))
    time_now = dt.datetime.fromtimestamp(time_now)

    print(available_balance)
    print(time_now)

avail_balance("BTC")


# (expected result)
# 4.399e-05
# 2022-11-05 19:39:41

5. 마치며

바이비트API, 키움증권OpenAPI 등 API에서 수신받은 데이터는

문자형으로 사용자에게 제공된다.

 

수신받은 데이터가 소수점을 가진 데이터라면,

우선은 float형(실수)으로 바꾸어주고 나서,

int형(정수)형으로 바꾸어주면,

시간을 출력할 때, 마이크로 초가 삭제되고 출력된다.

반응형