program story

dateutil없이 파이썬에서 시간대 인식 문자열을 datetime으로 변환하는 방법은 무엇입니까?

inputbox 2020. 12. 30. 08:09
반응형

dateutil없이 파이썬에서 시간대 인식 문자열을 datetime으로 변환하는 방법은 무엇입니까?


시간대 인식 문자열을 파이썬 datetime객체 로 변환해야 합니다.

예를 들면 2012-11-01T04:16:13-04:00.

dateutil이를 수행하는 구문 분석 기능이 있는 모듈이 있지만 종속성을 추가하므로 실제로 사용하고 싶지 않습니다.

그래서 어떻게 할 수 있습니까? 나는 다음과 같은 것을 시도했지만 운이 없다.

datetime.datetime.strptime("2012-11-01T04:16:13-04:00", "%Y-%m-%dT%H:%M:%S%Z")

Python 3.7부터 datetime.datetime.fromisoformat()형식을 처리 할 수 ​​있습니다.

>>> import datetime
>>> datetime.datetime.fromisoformat('2012-11-01T04:16:13-04:00')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000)))

이전 Python 버전에서는 수동으로 시간대를 정의하지 않으면 할 수 없습니다.

Python은 너무 빨리 구식이되기 때문에 시간대 데이터베이스를 포함하지 않습니다. 대신 Python은 적절하게 구성된 시간대를 제공하기 위해 훨씬 더 빠른 릴리스주기를 가질 수있는 외부 라이브러리에 의존합니다.

부작용으로 이는 시간대 구문 분석 도 외부 라이브러리 여야 함을 의미합니다 . dateutil너무 무거운 경우 iso8601대신 사용하면 특정 형식을 잘 구문 분석합니다.

>>> import iso8601
>>> iso8601.parse_date('2012-11-01T04:16:13-04:00')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=<FixedOffset '-04:00'>)

iso8601A는 무려 4 킬로바이트 작은이. 그 tot python-dateutil의 148KB를 비교하십시오 .

Python 3.2부터 Python 간단한 오프셋 기반 시간대를 처리 할 수 있으며 타임 스탬프에서 시간대 오프셋을 %z구문 분석 -hhmm하고 +hhmm있습니다. 즉, ISO 8601 타임 스탬프의 :경우 시간대에서 제거 해야합니다.

>>> from datetime import datetime
>>> iso_ts = '2012-11-01T04:16:13-04:00'
>>> datetime.strptime(''.join(iso_ts.rsplit(':', 1)), '%Y-%m-%dT%H:%M:%S%z')
datetime.datetime(2012, 11, 1, 4, 16, 13, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000)))

적절한 ISO 8601 구문 분석의 부족은 Python 문제 15873 에서 추적되고 있습니다.


다음은 dateutil 패키지를 사용하는 datetime 객체에 대한 Python 문서 입니다.

from dateutil.parser import parse

get_date_obj = parse("2012-11-01T04:16:13-04:00")
print get_date_obj

원래 질문의 코드에는 두 가지 문제가 있습니다. :시간대에 a가 없어야 하며 "시간대를 오프셋으로 사용" 의 형식 문자열 은 대문자가 %z아닌 소문자 %Z입니다.

이것은 Python v3.6 에서 나를 위해 작동합니다.

>>> from datetime import datetime
>>> t = datetime.strptime("2012-11-01T04:16:13-0400", "%Y-%m-%dT%H:%M:%S%z")
>>> print(t)
2012-11-01 04:16:13-04:00

저는 Python을 처음 접했지만 변환하는 방법을 찾았습니다.

2017-05-27T07:20:18.000-04:00 ...에

2017-05-27T07:20:18 새로운 유틸리티를 다운로드하지 않고.

from datetime import datetime, timedelta

time_zone1 = int("2017-05-27T07:20:18.000-04:00"[-6:][:3])
>>returns -04

item_date = datetime.strptime("2017-05-27T07:20:18.000-04:00".replace(".000", "")[:-6], "%Y-%m-%dT%H:%M:%S") + timedelta(hours=-time_zone1)

문자열을 너무 많이 자르지 않고이 작업을 수행 할 수있는 더 좋은 방법이 있다고 확신하지만이 작업을 완료했습니다.


이렇게 변환 할 수 있습니다.

date = datetime.datetime.strptime('2019-3-16T5-49-52-595Z','%Y-%m-%dT%H-%M-%S-%f%z')
date_time = date.strftime('%Y-%m-%dT%H:%M:%S.%fZ')

참조 URL : https://stackoverflow.com/questions/13182075/how-to-convert-a-timezone-aware-string-to-datetime-in-python-without-dateutil

반응형