파이썬에서 텔레그램 챗봇 API를 통한 주식매매정보 보내기

AI주식자동매매|2021. 1. 24. 11:03
반응형

안녕하세요?

주식자동매매 프로그램을 만들고 나면, 추천종목정보나 체결정보를 메신저로 받아보고 싶으실텐데,

Slack이나 텔레그램봇을 이용하여 쉽게 구현이 가능했습니다.

 

이번에는 가장 쉬운, 텔레그램챗봇을 만들어서 추천종목을 공유하는 방법을 정리해 보겠습니다.

자동매매프로그램에서 텔레그램에 정보를 보내기 위해서 꼭 필요로 하는 정보는 Bot Token 및 Chat Id 입니다.

Telegram API 를 이용하여 Bot Token(발신인) 이 Chat Id(수신인) 으로 메시지를 보내는 개념입니다.

 

 

1. 모바일 텔레그램의 대화방 탭에서 BotFather를 검색합니다.

   

2. BotFather를 선택하면 안내문이 나타납니다.  대충 내용 확인하시고, /start를 입력해 줍니다.

   

3. 대화창에서 /newbot 를 입력하여 새로운 봇을 만듭니다.

3. name 과 username 을 입력합니다.

  이때 name 은 말 그대로 봇을 부르는 이름으로 내가 알아보기 쉽게 지으면 됩니다.

   (나중에 /setname 명령으로 수정할 수도 있으니 name은 가볍게 지으시면 됩니다.)

   username 은 일종의 id 와 같은 개념으로 반드시 bot 으로 끝나야하며(TetrisBot or tetris_bot), 기존에 텔레그램에 등     록되어있는 username 은 사용할 수 없으므로 신중히 생각해서 입력하시기 바랍니다. 중복되면 안됩니다.

저는 name과 username을 똑 같이 입력해 버렸네요. 귀찮아서.. ㅎㅎ

username까지 입력하면, 다음과 같이 HTTP API정보를 보내줍니다. 숫자:알파벳 내용으로 되어 있습니다.

이 값이 Token입니다. 보안을 유의해서 잘 보관해 둡니다. 

4. 이제 메시지의 발신인이 될 봇을 만들고 봇의 Token 값을 알았으니,

   메시지의 수신인이 될 나의 Chat Id 를 확인하셔야 합니다.

   브라우저 주소 입력창에 https://api.telegram.org/bot봇Token값/getUpdates 를 입력합니다.

   "봇Token값" 위치에 3번에서 확인받은 Token값을 모두 full로 입력합니다.

  그러면, 그림이 너무 작긴 하지만, ,"chat":{"id": 뒤의 숫자정보가 본인의 chat_id입니다.

 

5. 이제 대화를 시작해야 할 수 있습니다.

   앞서 봇을 만들었던 BotFather 와의 대화창에서 t.me/??????bot 를 누르면 아래와 같은 대화창이 뜨고

   여기서 반드시 START(또는 시작) 를 눌러 텔레그램봇과의 대화를 시작할 수 있습니다.

6. 이제 파이썬 프로그램에서 token정보와 chat id를 이용해서 주식정보를 보내보겠습니다.

   보안때문에 token정보와 chat id는 가상의 정보이니 참고 바랍니다.

   하기는 소스의 해당 부분만을 적었습니다.

   추천종목정보의 종목코드(종목명), 현재가, 목표가, 목표가 매매시 예상수익률 관련 정보와

   해당 주봉, 일봉, 5분봉 정보 chart를 보내는 예제입니다. 

import telegram
.
.
class 
Kiwoom(QAxWidget, metaclass=Singleton):
   def __init__(self, parent=None, **kwargs):
        super().__init__(parent, **kwargs)
        .
        .
 
        self
.token = "219999999:AAZZZZZZZzzzzzzzzzZZZZZZ9UI"
        self.bot = telegram.Bot(self.token)
   
   def call_show_canvas(self):
        .
        .
        .
        try:
            self.bot.sendMessage(chat_id=218888888, text="(%s)기준 매수추천 종목입니다. 실제 매수여부는 각자가 판단하셔 
                                                                           야 합니다
." % (recomm_interval))
            self.bot.sendMessage(chat_id=218888888, text="%s(%s) %s, 현재가:%s, 목표가:%s(%s프로)" %           
                                             (stockName
, stockCode, market_status, current_price, target_sell_price, target_sell_rate))
       except:
            self.logging.logger.debug('chat_id: {}; error: {}'.format('1440986979', 'Error while sending notification'))

       .
       .
       .
      try:
           self.bot.send_photo(chat_id=218888888, photo=open(pic, 'rb')) #
      except:
           pass

 

실제 프로그램을 실행시켜보면, 다음과 같이 정상적으로 텔레그램봇이 주식정보를 받는 모습을 확인하실 수 있습니다.

1월 24일 기준으로 효성첨단소재 종목을 매수하라고 하네요. 

187,000원에 매입하면, 목표가 233,000원에 매도하여 24.3%의 수익률을 낼 수 있다네요..  맞을까요? ㅎㅎ

(무조건 따라 하시면 안됩니다.. 아래 메세지 경고문 참조하시구요.. ^^)

 

이상입니다~~ 

반응형

댓글()

Anaconda Installers를 활용한 파이썬 설치 및 개발환경 설정

반응형

오늘 Anaconda 3.8 64bit버젼을 다시 설치를 하게되었는데,

32bit env환경에서 PyQt5 를 설치할 수가 없었습니다.

결국 해결은 했습니다만, 저처럼 고생하실 분들을 위해서 미리 적어둡니다.

혹시, 여기서 저와 같이 고생하시는 분들에게 도움이 된다면 좋겠습니다.

 

설치 오류났던 환경은 다음과 같습니다.

Windows10환경은 64bit 환경이라, 64-bit용 Anaconda를 설치하여 Python을 설치를 하게됩니다.

현재 최종버젼이 3.8버젼이라서, 이 버젼을 다운받아 설치를 했습니다.

주식 API를 사용하기 위해서는 32bit 가상환경을 만들어야만 하기에,

파이썬 버젼 3.8에 맞춰 가상환경을 만들었습니다.

>python -m pip install --upgrade pip

>set CONDA_FORCE_32BIT=1
>conda create -n py38_32 python=3.8 anaconda
>activate py38_32

문제는 여기서 부터 발생한것 같습니다.

추가로 pyqt5를 설치했는데.. 제대로 설치가 되지 않고, 오류가 계속 발생했습니다.

>pip install pyqt5
>pip install mpl_finance

 

오류유형1)

Could not find a version that satisfies the requirement PyQt5-sip

오류유형2)

DLL load failed when importing PyQt5

 

결국, 파이썬 python=3.8 을 사용한것이 문제인가 싶어서, python=3.7을이용했더니,

오류가 없어졌습니다.

결국, 정리하자면,

32bit env환경에서 Python 3.8버젼은 PyQt5와 호환되지 않는것 같다는 결론입니다.

1. env 삭제
>conda env remove -n py38_32

2. 폴더삭제
   C:\ProgramData\Anaconda3\envs\py38_32

3. env다시 생성
>set CONDA_FORCE_32BIT=1
>conda create -n py37_32 python=3.7 anaconda
>activate py37_32
>conda env list

>pip install pyqt5
>pip install mpl_finance

 

위 작업들은 anaconda prompt를 사용하여 설치를 했습니다.

추가로, 현재 설치된 파이썬의 버젼을 확인해 보겠습니다.

(py37_32) C:\Windows\system32>python -V
Python 3.8.5

파이선이 설치되어 있는 위치 확인하기

반응형

댓글()

키움 API호출시 한글깨짐 해결하기

카테고리 없음|2020. 11. 18. 07:54
반응형

어쩔 수 없이 영문 윈도에서 한글 언어 패치하여 사용할 경우,

하기와 같이 한글이 깨져서 보이는 경우가 있습니다.

이때는 키움증권 인증서로그인이 되지 않고,

opstater에서 에러가 걸려 더이상 로그인이 되지 않는 형상이 발생합니다.

 

제어판 > 국가 또는 지역 > 관리자 옵션 에서

"유니코드를 지원하지 않는 프로그램용 언어"를 한국어(대한민국)으로

설정한 후 다시 실행하면 됩니다..

반응형

댓글()

KOAStudio실행시 한글깨짐현상

카테고리 없음|2020. 11. 12. 23:58
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

No module named 'talib'

반응형

TA_Lib-0.4.19-cp37-cp37m-win32.whl
0.36MB

[파이썬] TA-LIB 파이썬 패키지 설치

ta-lib란?
주식 차트의 기술적 분석을 위한 200여 가지의 지표 함수를 제공하는 C 라이브러리인데, 파이썬으로 포팅되어있다.
– 공식홈페이지: http://ta-lib.org/
– 함수 목록: http://ta-lib.org/function.html
– Python 패키지 및 엑셀 플러그 인 제공
https://github.com/mrjbq7/ta-lib
http://mrjbq7.github.io/ta-lib/doc_index.html

설치로그:나의 오후를 잡아 먹은 삽질을 정리해보았다.
앞서 아나콘다4.2.0(파이썬3.7) 32비트 버전과 zipline이 설치된 상태에서

# 소스코드 컴파일하여 설치하는 방법(Install TA-Lib C Library on Windows 10)

http://timebird.egloos.com/7390887 

  1. Download and Unzip ta-lib-0.4.0-msvc.zip(https://github.com/mrjbq7/ta-lib)
  2. Move the Unzipped Folder ta-lib to C:\
  3. Download and Install Visual Studio Community 2015 또는 Visual C++ Build Tools
  4. Build TA-Lib Library
    4-1) 명령프롬프트 실행 [VS2015 x86 Native Tools Command Prompt]
    4-2) C:\ta-lib\c\make\cdr\win32\msvc 로 이동
    4-3) nmake 실행
  5. [Anaconda Prompt] 실행(관리자권한으로 실행 추천)
  6. pip install ta-lib
  7. 임포트시 RuntimeError: module compiled against API version 0xb but this version of numpy is 0xa 같은 에러가 나는 경우 numpy업그레이드(pip install numpy –upgrade)

# 비공식 윈도우용 바이너리로 설치하는 방법(Unofficial Windows Binaries for Python Extension Packages)

  1. https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib 로 이동
  2. c:\TA_Lib-0.4.21-cp37-cp37m-win32.whl 을 다운받는다(32비트  파이썬3.7용 TA-Lib)
  3. [Anaconda Prompt] 실행
  4. pip install c:\TA_Lib-0.4.21-cp37-cp37m-win32.whl

 

반응형

댓글()

파이썬의 시간대

카테고리 없음|2020. 10. 8. 22:56
반응형

1. 파이썬의 datetime.datetime.now()는 실행 환경의 시간대에 따라서 시각을 표시합니다.

    2019-01-01 00:00:00 +09:00에 시간대가 Asia/Seoul로 설정된 랩탑에서 현재 시각

>>> print(datetime.datetime.now())
2019-01-01 00:00:00.000000

   같은 시각에 Asia/Taipei로 설정된 랩탑에서는 현재 시각이 아래와 같이 표시된다.

>>> print(datetime.datetime.now())
2018-12-31 23:00:00.000000

2. 나라별 시간대 비교하기

시간대 나라 코드
UTC+9 대한민국 KST
     

3. 시간대와 같이 표현하여 사용(aware)

대한민국은 UTC를 기준표시: 

 대한민국(2019-01-01 00:00:00+09:00),

 대만     (2019-01-01 00:00:00+08:00)

 

4. 파이썬의 datetime

datetime은 파이썬에서 기본으로 제공하는 표준 라이브러리로, 간단하거나 복잡한 방식으로 날짜와 시각을 조작하기 위한 클래스를 제공합니다.

  • naive datetime : naive datetime 객체는 그 자체만으로 시간대를 찾을 수 있는 충분한 정보를 포함하지 않습니다. (e.g. datetime.datetime(2019, 2, 15, 4, 58, 4, 114979))

  • aware datetime(timezone-aware) : 시간대를 포함합니다. (e.g.datetime.datetime(2019, 2, 15, 4, 58, 4, 114979, tzinfo=<UTC>)) aware datetime 객체는 자신의 시각 정보를 다른 aware datetime 객체와 상대적인 값으로 조정할 수 있도록 시간대나 일광 절약 시간 정책 혹은 적용 가능한 알고리즘 정보를 담고 있습니다.

naive datetime은 어느 시간대를 기준으로 하는 시각인지 모호하므로 aware datetime을 이용하는 것을 권장합니다.

여기서는 datetime을 쉽게 다루기 위해 pytz 라이브러리를 사용합니다. pytz는 아래와 같은 장점이 있습니다.

  1. 시간대를 시간차가 아닌 사람이 알아보기 쉬운 지역 이름으로 비교적 쉽게 설정할 수 있습니다.
  2. 원하는 시간대의 aware datetime으로 변경해주는 localize() 메소드를 제공합니다.

now는 UTC를 기준으로 현재 시각을 생성합니다. 하지만, naive한 시각입니다.

now = datetime.datetime.utcnow()

 

 

1. naive datetime은 절대 사용하지 않습니다.

가장 큰 이유는 naive datetime과 aware datetime을 서로 섞어서 쓰지 못한다는 것입니다.

 

동적 타입 언어에서 쓸 수 있는 가장 간단한 타입 검사 수단인 isinstance() 체크로도 이 둘을 구별할 수가 없으므로, 코드의 어느 지점에서 naive datetime이 섞이기 시작하면 예기치 않은 지점에서 버그 발생 가능성이 급격히 올라갑니다. Python 2에서 str과 unicode를 섞으면 안 되는 것과 비슷한 이유라고 생각하시면 됩니다.

2. 장기적으로 보존해야 하는 datetime은 항상 UTC를 기준으로 저장합니다.

지역 시간대는 지정학적 또는 정치적인 이유로 생각보다 자주 바뀝니다. 예컨대 1961년 이전까지 한국은 UTC+08:30을 지역 시간대로 사용했었고, 1988년 올림픽 즈음에는 일광 절약 시간대를 시행하고 있었습니다. 시간대 데이터베이스(tz database)는 이런 변경 내역을 담고 있고, pytz가 제공하는 시간대 객체의 동작에도 반영되어 있습니다. 그 때문에 시간대 데이터베이스가 제때 업데이트되지 않거나, 갑작스러운 시간대 변경으로 데이터베이스에 반영이 늦어지거나 하면, 시간 계산에서 오차가 발생할 여지가 있습니다. 또한 같은 aware datetime 이어도 서로 다른 시간대를 가진 datetime끼리 연산하거나 하는 상황도 문제를 복잡하게 만들고, DB나 다른 서비스의 API를 사용할 때, 그 서비스가 시간대를 제대로 다루는 데에 필요한 복잡도를 감수하는 대신 단순히 UTC 기준의 고정 오프셋 시간대만 사용하는 등의 이유로 서로 지원 범위가 맞지 않아 곤란을 겪을 수도 있습니다.

반응형

댓글()

빗썸API 호출시 에러 코드

가상화폐|2020. 9. 22. 01:45
반응형

에러 코드

빗썸 API 호출 요청 시 상황에 따라 보여지는 에러 코드입니다.

Error Message

에러 코드, 에러 메시지, 설명으로 구성된 표에러 코드에러 메시지설명

5100 Bad Request(SSL) https 호출 URL이 아님
Bad Request(Bad Method) POST 형식으로 호출하지 않음
Bad Request(Auth Data) 잘못된 요청 내용
Bad Request
(Request Time:reqTime{호출시간}/nowTime{서버시간})
API 서버 시간과 API 호출 시간이 20초 이상 차이남
(시간 기준: KST)
5200 Not Member 회원가입이 되어있지 않음
5300 Invalid Apikey 올바르지 않은 API Key, Secret Key로 호출
5302 Method Not Allowed.(Access IP) 접속 허용 IP가 아님
Method Not Allowed.(BTC Adress) BTC 출금 허용 주소가 아님
Method Not Allowed.(Access) API 활성화 시 설정한 항목 외 호출했을 경우
5400 Database Fail 데이터베이스 에러일 경우
5500 Invalid Parameter 잘못된 인자 값으로 호출
상장 코인이 아닙니다. 상장되지않은 코인으로 API 호출시
5600 too many connections 과도한 접속시도로 인한 접속제한 상태
특정 IP 차단 (일반적인 유저에게는 나타날 수 없음)
Please try again 과도한 거래시도로 인한 접속제한
Not Allow IP PRIME이 아닌 유저가 PRIME/public API를 요청
정상적으로 처리되지 못했습니다. 잠시 후 다시 이용해 주십시오. DB에러
시스템이 원활하지 않습니다. 잠시 후 다시 시도해 주세요. 특정값 조회 실패
접속 차단된 IP입니다. IP가 차단된 PC에서 API 호출
Check API Key Type, API Key 타입을 확인하세요. 일반유저가 PRIME호출, PRIME유저가 일반 API호출
회원탈퇴 심사중인 회원입니다. 회원탈퇴 심사중인 유저가 API호출
이메일 인증을 받지 않았습니다. 이메일인증을 받지 않은 회원이 API호출
탈퇴한 회원입니다. 탈퇴한 유저의 API_KEY로 API호출
접속 차단된 사용자 입니다. 관리자에게 문의하세요. IP가 차단된 PC에서 API 호출
휴대폰 차단된 사용자 입니다. 관리자에게 문의하세요. 휴대폰번호가 차단된 계정의 API_KEY로 API호출
회원 자산을 가져올 수 없습니다. 잠시 후 이용 부탁드립니다. 일시적인 오류 혹은 자산조회가 불가능한 상태
수수료를 가져올 수 없습니다. 잠시 후 이용 부탁드립니다. 일시적인 오류 혹은 수수료정보가 조회 불가능한 상태
잘못된 접근입니다. 서비스 하지 않는 코인 조회 시도
2000 회원정보 조회 실패
거래 진행중인 내역이 존재하지 않습니다. 입력한 주문번호로 조회시 해당 주문이 존재하지 않았을 경우 (대기건이 종료처리 혹은 취소처리 또는 유저가 잘못된 번호를 입력)
잘못된 화폐단위입니다. 잘못된 통화를 입력
거래 동의 후 이용 가능합니다. 거래동의가 필요한 코인을 거래시도시 동의여부가 없을 경우
코인 수량은 소수점 X째 자리까지만 입력 가능합니다. 입력허용범위를 넘어선 소수점 입력
수량(소수점)을 확인해 주십시오. 코인수량 및 금액의 소수점을 잘못 입력
약관동의 후 거래 가능합니다. 거래동의가 필요한 코인을 거래시도시 동의여부가 없을 경우
금액(소수점)을 확인해 주십시오. 시세가 100원미만인 코인이 소수점이 포함 되어 있지 않은 금액으로 주문 요청 코인의 소수점이 호가단위의 소수점보다 낮을 경우
주문 가격은 X단위로 입력이 가능합니다. 호가단위에 맞지 않는 주문 요청
X원 단위로 거래 가능합니다. 호가단위에 맞지 않는 주문 요청
1회 최대 요청 제한금액을 가져올 수 없습니다. 주문 1회 최대 요청 제한금액 정보를 가져올 수 없는 경우
COIN 1회 최대 요청 제한수량을 가져올 수 없습니다. 주문 1회 최대 요청 제한수량 정보를 가져올 수 없는 경우
1회 최대금액은 X원 미만입니다. 주문할 수 없습니다. 1회 주문 가능한 최대 원화를 넘긴 주문 요청
1회 최대 수량은 X코인 미만입니다. 주문할 수 없습니다. 주문가능 최대수량을 넘어선 수량을 주문 요청
최소 구매수량은 X코인 입니다. 최소 주문 가능수량 보다 낮은 수량을 주문 요청
구매 주문 가능 금액을 가져올 수 없습니다. 주문 가능금액 제한율을 가져올 수 없는 경우
판매대기 셀을 가져올 수 없습니다. 현재 판매 대기건을 조회하지 못 한 경우
주문 가능 금액은 X KRW이상만 가능합니다. 최소주문 KRW보다 낮은 주문 요청
구매 가능 금액보다 높은 가격입니다. 현재시세에 따른 최대 주문금액 초과
COIN 소수점 제한 값을 가져올 수 없습니다. 해당 COIN의 소수점 제한값을 가져 오지 못한 경우
COIN소수점 입력 제한값을 가져올 수 없습니다. COIN 소수점 입력제한 정보를 가져 오지 못한 경우
코인 수량의 소수점 X자리까지만 유효합니다. 해당코인 소수점 입력 제한을 초과한 주문 요청
수량/금액이 0입니다. 주문할 수 없습니다. 유효성 검사를 마친 금액이 0원인 경우
판매 주문 가능 금액을 가져올 수 없습니다. 주문가능금액 제한율을 가져올 수 없는 경우
구매대기 셀을 가져올 수 없습니다. 구매대기건의 정보를 가져올 수 없는 경우
판매 가능 금액보다 낮은 가격입니다. 최저 판매금액보다 작은 금액으로 주문 요청
잠시 후 다시 이용 부탁드립니다. 일시적인 오류 혹은 체결정보를 받아 오지 못한 경우
거래 체결내역이 존재하지 않습니다. 체결내역이 존재하지 않은 경우
회원정보를 가져오지 못했습니다. 회원정보조회 실패
출금 최소 금액은 X코인입니다. 최소 출금수량 보다 낮은수량 출금 요청
구 주소는 이용하실 수 없습니다. 구 주소로 출금 요청
X코인 수량은 소수점 X자리까지만 유효합니다. 요청된 수량의 수량 소수점 자리수가 정책상에 소수점자리수 보다 큰 경우
출금액이 1회 출금한도를 초과하였습니다. 1회 출금한도를 넘어선 수량으로 출금 요청
회원님은 현재 인증 단계에서 적용된 출금 잔여 한도가 초과되었습니다. 인증레벨에 따른 출금한도를 넘어선 수량으로 출금 요청(일별,월별)
출금 주소가 올바르지 않습니다. 입력한 출금주소가 올바르지 않은 경우
지갑 정보를 가져올 수 없습니다. 존재하지 않는 payment_id인 경우
회원 인증레벨 정보를 가져올 수 없습니다. 요청한 회원의 인증레벨 정보를 받아올 수 없는 경우
회원 월별 총 출금액을 가져올 수 없습니다. 인증레벨에 따른 월한도 출금량을 넘어선 출금 요청
최근 로그인 내역을 가져올 수 없습니다. 최근 활동내역이 없는 유저가 출금 요청
출금 최소 금액은 X 코인 입니다. 최소 출금한도 보다 적은 수량으로 출금 요청
출금가능 금액을 가져올 수 없습니다. 회원자산내역을 불러올 수 없는 경우
출금액이 출금가능액을 초과하였습니다. 등록할 수 없습니다. 출금 가능자산 보다 많은 수량으로 출금 시도
API를 통한 출금 서비스가 잠시 중단되었습니다. 출금을 원하시는 경우 PC WEB이나 모바일을 통해 출금 요청하시기 바랍니다. API 원화출금 차단 (현재 서비스 이용 불가)
구매하려는 수량보다 판매수량이 부족합니다. 현재 판매 대기건 보다 시장가 구매 하려는 수량이 많은 경우
체결대상을 가져올 수 없습니다. 대기건을 조회할 수 없는 경우
시장가 거래 금엑제한 최대 값을 가져올 수 없습니다. 1회 최대 시장가 구매 제한값을 불러올 수 없는 경우
체결 row Lock 처리가 되지 않았습니다. 체결대상의 대기건이 Lock 처리 되지 않은 경우
판매수량이 부족합니다. 시장가 거래 중 수량이 부족한 경우
거래체결 시간을 가져올 수 없습니다. 해당 체결시 생성된 시간을 가져올 수 없는 경우
미체결 수량이 취소되었습니다. 거래내역을 확인하세요. 부분 체결시 안내 메시지
데이터를 불러올 수 없습니다. 빗썸지수 데이터를 불러 수 없는 경우
판매하려는 수량보다 구매수량이 부족합니다. 현재 구매 대기건 보다 시장가 판매 하려는 수량이 더 많은 경우
체결내역을 불러올수 없습니다. 체결 정보를 불러 올 수 없는 경우
호가정보를 가져올수 없습니다. 체결 정보를 불러 올 수 없는 경우
5900 Unknown Error 알 수 없는 에러

 

apidocs.bithumb.com/docs/err_code

 

No.1 가상자산 플랫폼, 빗썸

비트코인, 이더리움, 비트코인캐시, 리플, 라이트코인, 대시, 모네로, 비트코인골드, 이오스, 이더리움클래식, 퀀텀, 제트캐시, 실시간 시세, 쉽고 안전한 거래

www.bithumb.com

 

반응형

댓글()

TypeError: can't compare offset-naive and offset-aware datetimes

반응형

파이썬 프로그램에서 날자값을 비교하다보면 자주 접하는 오류가 

TypeError: can't compare offset-naive and offset-aware datetimes 인것 같습니다.

 

Error Code:

last_time = pd.to_datetime(self.chart_data[stockCode][-1:].time[0])
now = datetime.now()

if self.prev_time == last_time or self.prev_time >= last_time: # TypeError 발생부분
return

해결방법은 다음과 같습니다.

 

원인: 파이썬에서는 기본적으로 datetime 오브젝트는 aware가 아닌 "naive" 타입입니다.

        그래서, 비교 하려는 두 값 모두 같은 type의 오브젝트 여야 합니다.

 

Sampe Code:

import datetime
import pytz utc=pytz.UTC

challenge.datetime_start = utc.localize(challenge.datetime_start)

challenge.datetime_end = utc.localize(challenge.datetime_end)

# 이제 두개의 datetime 오브젝트는 모두 aware 타입이 되었으므로 비교가 가능합니다.

헷갈리시면, 다음과 같이 사용하셔도 됩니다.

start_time = challenge.datetime_start.replace(tzinfo=utc)
end_time = challenge.datetime_end.replace(tzinfo=utc)

 

참고로, datetime.timezone에 대해서 알아볼께요.

UTC를 기준으로 시간이 빠르면 +시차, 시간이 느리면 -시차로 표시합니다.

시간대나라코드

UTC-5 미국(동부) EST
UTC 영국 GMT
UTC+8 대만 TW
UTC+9 대한민국 KST
UTC+9 일본 JST
UTC+10 오스트레일리아(동부) AEST
  • 나라별 시간대 차이에 대한 더 자세한 내용은 여기를 참고해주세요.

 

참조사이트:

stackoverflow.com/questions/15307623/cant-compare-naive-and-aware-datetime-now-challenge-datetime-end

 

Can't compare naive and aware datetime.now() <= challenge.datetime_end

I am trying to compare the current date and time with dates and times specified in models using comparison operators: if challenge.datetime_start <= datetime.now() <= challenge.datetime_end:...

stackoverflow.com

spoqa.github.io/2019/02/15/python-timezone.html

 

파이썬의 시간대에 대해 알아보기(datetime.timezone)

파이썬의 시간대에 대해서 알아봅니다.

spoqa.github.io

 

반응형

댓글()