본문 바로가기
Python

Python - 문자열을 Datetime변환시 TimeZone(strptime unconverted data remains) 해결하기

by 올엠 2024. 3. 14.
반응형

문자열로 되어 있는 값을 Datetime으로 변환하고자 한다면, 정확하게 각 문자열이 시간데이터 셋과 동일하게 맞추어야 하는데, Timezone을 인식 시키는 방법에 대해서 간단히 알아보고자 한다.

만약 아래와 같이 한국 타임존값이 들어 있는 것의 경우를 가정해 보겠다.

'2023-12-18T15:47:56.599821424+09:00'

>>> import datetime
>>> str_date_time = '2023-12-18T15:47:56.599821424+09:00'
>>> convert_datetime = datetime.datetime.strptime(str_date_time, '%Y-%m-%dT%H:%M:%S.%f')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/_strptime.py", line 352, in _strptime
    raise ValueError("unconverted data remains: %s" %
ValueError: unconverted data remains: 424+09:00


위 오류를 을 가장 이상적으로 변환하는 방법은 값을 자리로 잘라내거나, isoparse 라이브러리를 사용하는 방법이 되겠다.

1. 잘라내기

이 방법은 타임 문자열은 보통 정확한 자릿수를 가지고 있기 때문에 이를 기준으로 구분하는 것이 가장 유용한 방법이라고 할 수 있다.

보통 오류가 날 경우 오류가 발생한 문자열 위치가 나타난다. 위 경우는 424+09:00 이므로 여기를 기준으로 문자열을 삭제하는 방법이 유용하다.

2023-12-18T15:47:56.599821의 문자열 인덱스는 26이다. 그럼 26으로 먼저 잘라보도록 하자.

>>> str_date_split = str_date_time[:26]
>>> str_date_split
'2023-12-18T15:47:56.599821'
>>> convert_datetime = datetime.datetime.strptime(str_date_split, '%Y-%m-%dT%H:%M:%S.%f')
>>> convert_datetime
datetime.datetime(2023, 12, 18, 15, 47, 56, 599821)


이외에도 split를 + 기호 기준으로 진행하는 것도 방법이다.

다만 위와 같이 값이 밀리세컨드가 아닌 나노세컨드? 방식이거나, 타임값이 일정하지 않은 경우 isoparse를 사용하는 것이 좋다.

isoparse 사용하기

만약 타임값이 부정확 하다면, isoparse 라이브러리를 사용하기를 추천한다.

아래와 같이 라이브러리를 사용하면, 타임존이 있거나 없더라도 이를 구분하여 처리해 준다.

>>> from dateutil.parser import isoparse
>>> isoparse(str_date_split)
datetime.datetime(2023, 12, 18, 15, 47, 56, 599821)
>>> str_date_time = '2023-12-18T15:47:56.599821424+09:00'
>>> isoparse(str_date_time)
datetime.datetime(2023, 12, 18, 15, 47, 56, 599821, tzinfo=tzoffset(None, 32400))
 

 

반응형