programing

날짜 활용 없이 파이썬에서 시간대 인식 문자열을 날짜 시간으로 변환하는 방법?

codeshow 2023. 9. 24. 13:11
반응형

날짜 활용 없이 파이썬에서 시간대 인식 문자열을 날짜 시간으로 변환하는 방법?

시간대 인식 문자열을 변환해야 합니다."2012-11-01T04:16:13-04:00"피톤에게datetime물건.

봤어요.dateutilparse 기능이 있는 module이지만, 의존성이 추가되어 별로 사용하고 싶지 않습니다.

그럼 어떻게 하죠?저는 다음과 같은 것을 시도해 보았지만 운이 없었습니다.

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은 훨씬 빠른 릴리스 주기를 가질 수 있는 외부 라이브러리를 사용하여 적절하게 구성된 시간대를 제공합니다.

이는 부작용으로 시간대 파싱 또한 외부 라이브러리일 필요가 있음을 의미합니다. 만약dateutil무게가 너무 많이 나가기 때문에 대신 사용하면 특정 포맷을 잘 해석할 수 있습니다.

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

iso8601무려 4KB가 작습니다.그것을 비교해 보세요.python-dateutil148KB입니다.

파이썬 3.2 시점에서 파이썬은 간단한 오프셋 기반 시간대를 처리할 수 있으며,%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 Doc입니다.

from dateutil.parser import parse

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

원래 질문의 코드에 두 가지 문제가 있습니다. 즉, 다음과 같은 것이 없어야 합니다.:표준 시간대에서 "오프셋으로서의 표준 시간대"에 대한 형식 문자열은 소문자입니다.%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

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

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')

표준 시간대를 알 수 없는 개체를 생성하고 해당 개체를 교체할 수 있습니다.tzinfo시간대별로 알아채게 해요.DateTime나중에 목적을 정합니다.

from datetime import datetime
import pytz

unware_time = datetime.strptime("2012-11-01 04:16:13", "%Y-%m-%d %H:%M:%S")
aware_time = unaware_time.replace(tzinfo=pytz.UTC)

파이썬을 처음 접하지만 변환할 방법을 찾았습니다.

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)

이 일을 그렇게 많이 자르지 않고 할 수 있는 더 좋은 방법이 있을 거라고 확신하지만, 이로써 일은 끝이 났습니다.

Mohhideen bin Mohammed의 dateutil을 사용하기 위한 이 제안은 작은 도서관이 필요하더라도 분명히 최고의 해결책입니다.다양한 형태의 실패가 발생하기 쉬운 다른 접근법을 사용했습니다.여기에 이를 위한 좋은 기능이 있습니다.

from dateutil.parser import parse


def parse_date_convert(date, fmt=None):
    if fmt is None:
        fmt = '%Y-%m-%d %H:%M:%S' # Defaults to : 2022-08-31 07:47:30
    get_date_obj = parse(str(date))
    return str(get_date_obj.strftime(fmt))

dates = ['2022-08-31T07:47:30Z','2022-08-31T07:47:29.098Z','2017-05-27T07:20:18.000-04:00','2012-11-01T04:16:13-04:00']

for date in dates:
    print(f'Before: {date}  After: {parse_date_convert(date)}')

결과:

Before: 2022-08-31T07:47:30Z  After: 2022-08-31 07:47:30
Before: 2022-08-31T07:47:29.098Z  After: 2022-08-31 07:47:29
Before: 2017-05-27T07:20:18.000-04:00  After: 2017-05-27 07:20:18
Before: 2012-11-01T04:16:13-04:00  After: 2012-11-01 04:16:13

이렇게 TZ를 대체하는 Slicing split 등 다양한 형태를 시도해 본 결과:

dates = ['2022-08-31T07:47:30Z','2022-08-31T07:47:29.098Z','2017-05-27T07:20:18.000-04:00','2012-11-01T04:16:13-04:00']

for date in dates:
    print(f'Before: {date}  After: {date.replace("T", " ").replace("Z", "")}')

당신은 여전히 저조한 결과를 가지고 있습니다.아래와 같이

Before: 2022-08-31T07:47:30Z  After: 2022-08-31 07:47:30
Before: 2022-08-31T07:47:29.098Z  After: 2022-08-31 07:47:29.098
Before: 2017-05-27T07:20:18.000-04:00  After: 2017-05-27 07:20:18.000-04:00
Before: 2012-11-01T04:16:13-04:00  After: 2012-11-01 04:16:13-04:00

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

반응형