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

 

반응형

댓글()

Python data Type - Datetime

반응형

자주 사용하게 되지만, 자주 헷갈리는 Python의 자료형에 대해서 정리를 해 나가겠습니다.

오늘은 Datetime입니다.

 

주어진 String값을 DateTime형식으로 바꾸기: strptime

 

Example 1: string to datetime object

from datetime

import datetime

 

date_string = "21 June, 2018"

 

print("date_string =", date_string)

print("type of date_string =", type(date_string))

 

date_object = datetime.strptime(date_string, "%d %B, %Y")

 

print("date_object =", date_object)

print("type of date_object =", type(date_object))

 

실행경과>

date_string = 21 June, 2018
type of date_string = <class 'str'>
date_object = 2018-06-21 00:00:00
type of date_object = <class 'datetime.datetime'>

Example 2: string to datetime object

from datetime

import datetime

dt_string = "12/11/2018 09:15:32"

# Considering date is in dd/mm/yyyy format

dt_object1 = datetime.strptime(dt_string, "%d/%m/%Y %H:%M:%S")

print("dt_object1 =", dt_object1)

# Considering date is in mm/dd/yyyy format

dt_object2 = datetime.strptime(dt_string, "%m/%d/%Y %H:%M:%S")

print("dt_object2 =", dt_object2)

실행경과>

dt_object1 = 2018-11-12 09:15:32
dt_object2 = 2018-12-11 09:15:32

 

Format Code List

The table below shows all the format codes that you can use.

Directive Meaning Example
%a Abbreviated weekday name. Sun, Mon, ...
%A Full weekday name. Sunday, Monday, ...
%w Weekday as a decimal number. 0, 1, ..., 6
%d Day of the month as a zero-padded decimal. 01, 02, ..., 31
%-d Day of the month as a decimal number. 1, 2, ..., 30
%b Abbreviated month name. Jan, Feb, ..., Dec
%B Full month name. January, February, ...
%m Month as a zero-padded decimal number. 01, 02, ..., 12
%-m Month as a decimal number. 1, 2, ..., 12
%y Year without century as a zero-padded decimal number. 00, 01, ..., 99
%-y Year without century as a decimal number. 0, 1, ..., 99
%Y Year with century as a decimal number. 2013, 2019 etc.
%H Hour (24-hour clock) as a zero-padded decimal number. 00, 01, ..., 23
%-H Hour (24-hour clock) as a decimal number. 0, 1, ..., 23
%I Hour (12-hour clock) as a zero-padded decimal number. 01, 02, ..., 12
%-I Hour (12-hour clock) as a decimal number. 1, 2, ... 12
%p Locale’s AM or PM. AM, PM
%M Minute as a zero-padded decimal number. 00, 01, ..., 59
%-M Minute as a decimal number. 0, 1, ..., 59
%S Second as a zero-padded decimal number. 00, 01, ..., 59
%-S Second as a decimal number. 0, 1, ..., 59
%f Microsecond as a decimal number, zero-padded on the left. 000000 - 999999
%z UTC offset in the form +HHMM or -HHMM.  
%Z Time zone name.  
%j Day of the year as a zero-padded decimal number. 001, 002, ..., 366
%-j Day of the year as a decimal number. 1, 2, ..., 366
%U Week number of the year (Sunday as the first day of the week). All days in a new year preceding the first Sunday are considered to be in week 0. 00, 01, ..., 53
%W Week number of the year (Monday as the first day of the week). All days in a new year preceding the first Monday are considered to be in week 0. 00, 01, ..., 53
%c Locale’s appropriate date and time representation. Mon Sep 30 07:06:05 2013
%x Locale’s appropriate date representation. 09/30/13
%X Locale’s appropriate time representation. 07:06:05
%% A literal '%' character. %

 

보다 많은 예시와 설명을 하기에서 참조하시면 됩니다.

www.programiz.com/python-programming/datetime/strptime

반응형

댓글()