[python] 파이썬 strptime () 및 시간대?

IPDDump를 사용하여 생성 된 Blackberry IPD 백업의 CSV 덤프 파일이 있습니다. 여기의 날짜 / 시간 문자열은 다음과 같습니다 ( EST호주 시간대).

Tue Jun 22 07:46:22 EST 2010

이 날짜를 파이썬으로 구문 분석 할 수 있어야합니다. 처음에는 strptime()datettime부터 함수 를 사용하려고했습니다 .

>>> datetime.datetime.strptime('Tue Jun 22 12:10:20 2010 EST', '%a %b %d %H:%M:%S %Y %Z')

그러나 어떤 이유로 datetime되돌아 오는 개체 와 관련된 개체가없는 것 같습니다 tzinfo.

나는 이 페이지 에서 분명히 datetime.strptime자동으로 버리는 내용을 읽었 tzinfo지만 문서를 확인했는데 여기에 문서화 된 그 영향에 대한 것을 찾을 수 없습니다 .

타사 Python 라이브러리 인 dateutil을 사용하여 날짜를 파싱 할 수 있었지만 내장 기능을 strptime()잘못 사용하는 방법에 대해 여전히 궁금합니다 . strptime()시간대를 잘 활용하는 방법이 있습니까?



답변

datetime모듈 문서는 말합니다 :

형식에 따라 파싱 된 date_string에 해당하는 날짜 시간을 반환합니다. 이는에 해당합니다 datetime(*(time.strptime(date_string, format)[0:6])).

저거 봐 [0:6]? 그게 당신을 얻는다 (year, month, day, hour, minute, second). 다른 건 없어 시간대에 대한 언급이 없습니다.

흥미롭게도, [Win XP SP2, Python 2.6, 2.7] 예제를 time.strptime전달해도 작동하지 않지만 “% Z”와 “EST”를 제거하면 작동합니다. 또한 “EST”대신 “UTC”또는 “GMT”를 사용하십시오. “PST”및 “MEZ”가 작동하지 않습니다. 수수께끼.

이것이 3.2 버전으로 업데이트되었으며 동일한 문서에도 다음 내용이 표시됩니다.

% z 지시문이 strptime () 메소드에 제공되면 인식하는 datetime 오브젝트가 생성됩니다. 결과의 tzinfo는 시간대 인스턴스로 설정됩니다.

% Z에서는 작동하지 않으므로 중요합니다. 다음 예를 참조하십시오.

In [1]: from datetime import datetime

In [2]: start_time = datetime.strptime('2018-04-18-17-04-30-AEST','%Y-%m-%d-%H-%M-%S-%Z')

In [3]: print("TZ NAME: {tz}".format(tz=start_time.tzname()))
TZ NAME: None

In [4]: start_time = datetime.strptime('2018-04-18-17-04-30-+1000','%Y-%m-%d-%H-%M-%S-%z')

In [5]: print("TZ NAME: {tz}".format(tz=start_time.tzname()))
TZ NAME: UTC+10:00


답변

python-dateutil 사용하는 것이 좋습니다 . 파서는 지금까지 던진 모든 날짜 형식을 파싱 할 수있었습니다.

>>> from dateutil import parser
>>> parser.parse("Tue Jun 22 07:46:22 EST 2010")
datetime.datetime(2010, 6, 22, 7, 46, 22, tzinfo=tzlocal())
>>> parser.parse("Fri, 11 Nov 2011 03:18:09 -0400")
datetime.datetime(2011, 11, 11, 3, 18, 9, tzinfo=tzoffset(None, -14400))
>>> parser.parse("Sun")
datetime.datetime(2011, 12, 18, 0, 0)
>>> parser.parse("10-11-08")
datetime.datetime(2008, 10, 11, 0, 0)

등등. strptime()말도 안되는 형식을 다루지 않습니다 … 그냥 날짜를 던지면 올바른 일을합니다.

업데이트 : 죄송합니다. 나는 당신이 당신이 사용했다고 언급 한 원래의 질문에서 그리워했습니다 dateutil. 그러나이 답변이 날짜 구문 분석 질문이 있고 해당 모듈의 유틸리티를 볼 때이 질문을 우연히 발견하는 다른 사람들에게 여전히 유용하기를 바랍니다.


답변

시간 문자열은 rfc 2822 의 시간 형식 (이메일의 날짜 형식, http 헤더) 과 유사합니다 . stdlib 만 사용하여 구문 분석 할 수 있습니다.

>>> from email.utils import parsedate_tz
>>> parsedate_tz('Tue Jun 22 07:46:22 EST 2010')
(2010, 6, 22, 7, 46, 22, 0, 1, -1, -18000)

다양한 Python 버전에 대해 시간대 인식 datetime 객체를 생성하는 솔루션을 참조하십시오 : 전자 메일에서 시간대로 날짜 구문 분석 .

이 형식에서는 EST의미 적으로와 같습니다-0500 . 일반적 으로 시간대 약어로는 충분하지 않지만 시간대를 고유하게 식별하기에는 충분하지 않습니다 .


답변

이 정확한 문제에 부딪쳤다.

내가 한 일 :

# starting with date string
sdt = "20190901"
std_format = '%Y%m%d'

# create naive datetime object
from datetime import datetime
dt = datetime.strptime(sdt, sdt_format)

# extract the relevant date time items
dt_formatters = ['%Y','%m','%d']
dt_vals = tuple(map(lambda formatter: int(datetime.strftime(dt,formatter)), dt_formatters))

# set timezone
import pendulum
tz = pendulum.timezone('utc')

dt_tz = datetime(*dt_vals,tzinfo=tz)


답변