[PYTHON] ISO 8601 datetime 문자열을 Python datetime 객체로 변환하려면 어떻게해야합니까? [복제]
PYTHONISO 8601 datetime 문자열을 Python datetime 객체로 변환하려면 어떻게해야합니까? [복제]
"2009-05-28T16 : 15 : 00"과 같은 형식으로 날짜 / 시간 문자열을 얻고 있습니다 (ISO 8601입니다). 하나의 해킹 옵션은 time.strptime을 사용하여 문자열을 구문 분석하고 touple의 처음 6 개 요소를 datetime 생성자에 전달하는 것으로 보입니다.
datetime.datetime(*time.strptime("2007-03-04T21:08:12", "%Y-%m-%dT%H:%M:%S")[:6])
나는 이것을하는 "깨끗한"방법을 찾을 수 없었다. 하나 있습니까?
해결법
-
==============================
1.나는 표준 시간대 처리 및 일반적으로 견고한 날짜 분석을 위해 dateutil 라이브러리를 사용하는 것을 선호합니다. 2010-05-08T23 : 41 : 54.000Z와 같은 ISO 8601 문자열을 얻으려면 strptime을 사용하여 파싱하는 것이 즐겁습니다. 특히 시간대가 포함되었는지 여부를 미리 알지 못하는 경우에 유용합니다. pyiso8601에는 내 사용 중에 겪었던 몇 가지 문제점 (추적기 확인)이 있으며 몇 년 후에 업데이트되지 않았습니다. 대조적으로, dateutil은 활동적이고 나를 위해 일했습니다 :
나는 표준 시간대 처리 및 일반적으로 견고한 날짜 분석을 위해 dateutil 라이브러리를 사용하는 것을 선호합니다. 2010-05-08T23 : 41 : 54.000Z와 같은 ISO 8601 문자열을 얻으려면 strptime을 사용하여 파싱하는 것이 즐겁습니다. 특히 시간대가 포함되었는지 여부를 미리 알지 못하는 경우에 유용합니다. pyiso8601에는 내 사용 중에 겪었던 몇 가지 문제점 (추적기 확인)이 있으며 몇 년 후에 업데이트되지 않았습니다. 대조적으로, dateutil은 활동적이고 나를 위해 일했습니다 :
import dateutil.parser yourdate = dateutil.parser.parse(datestring)
-
==============================
2.파이썬 2.5 :
파이썬 2.5 :
datetime.datetime.strptime("2007-03-04T21:08:12", "%Y-%m-%dT%H:%M:%S")
-
==============================
3.ISO 8601에는 선택적 콜론과 대시가 여러 가지로 제공되기 때문에 기본적으로 CCYY-MM-DDThh : mm : ss [Z | (+ | -) hh : mm]입니다. strptime을 사용하려면 먼저 해당 변형을 제거해야합니다.
ISO 8601에는 선택적 콜론과 대시가 여러 가지로 제공되기 때문에 기본적으로 CCYY-MM-DDThh : mm : ss [Z | (+ | -) hh : mm]입니다. strptime을 사용하려면 먼저 해당 변형을 제거해야합니다.
목표는 UTC datetime 객체를 생성하는 것입니다.
2016-06-29T19 : 36 : 29.3453Z와 같이 Z 접미사가있는 UTC에서 작동하는 기본 사례 만 원한다면 :
datetime.datetime.strptime(timestamp.translate(None, ':-'), "%Y%m%dT%H%M%S.%fZ")
2016-06-29T19 : 36 : 29.3453-0400 또는 2008-09-03T20 : 56 : 35.450686 + 05 : 00과 같은 시간대 오프셋을 처리하려면 다음을 사용하십시오. 이들은 20080903T205635.450686 + 0500과 같은 변수 구분 기호없이 모든 변형을 무언가로 변환하여 더 일관성 있고 해석하기 쉽습니다.
import re # This regex removes all colons and all # dashes EXCEPT for the dash indicating + or - utc offset for the timezone conformed_timestamp = re.sub(r"[:]|([-](?!((\d{2}[:]\d{2})|(\d{4}))$))", '', timestamp) datetime.datetime.strptime(conformed_timestamp, "%Y%m%dT%H%M%S.%f%z" )
시스템이 % z strptime 지시어를 지원하지 않으면 (ValueError와 같은 것을 볼 수 있습니다 : 'z'는 '% Y % m % dT % H % M % S. % f % z'형식의 잘못된 지시어입니다) 수동으로 시간을 Z (UTC)에서 오프셋합니다. 참고 % z는 Python 버전 <3에서 시스템에서 작동하지 않을 수 있습니다. 이는 시스템 / Python 빌드 유형 (즉, 자이 썬, Cython 등)에 따라 달라지는 C 라이브러리 지원에 따라 달라지기 때문입니다.
import re import datetime # This regex removes all colons and all # dashes EXCEPT for the dash indicating + or - utc offset for the timezone conformed_timestamp = re.sub(r"[:]|([-](?!((\d{2}[:]\d{2})|(\d{4}))$))", '', timestamp) # Split on the offset to remove it. Use a capture group to keep the delimiter split_timestamp = re.split(r"[+|-]",conformed_timestamp) main_timestamp = split_timestamp[0] if len(split_timestamp) == 3: sign = split_timestamp[1] offset = split_timestamp[2] else: sign = None offset = None # Generate the datetime object without the offset at UTC time output_datetime = datetime.datetime.strptime(main_timestamp +"Z", "%Y%m%dT%H%M%S.%fZ" ) if offset: # Create timedelta based on offset offset_delta = datetime.timedelta(hours=int(sign+offset[:-2]), minutes=int(sign+offset[-2:])) # Offset datetime with timedelta output_datetime = output_datetime + offset_delta
-
==============================
4.Arrow는 이것에 대해 유망 해 보인다.
Arrow는 이것에 대해 유망 해 보인다.
>>> import arrow >>> arrow.get('2014-11-13T14:53:18.694072+00:00').datetime datetime.datetime(2014, 11, 13, 14, 53, 18, 694072, tzinfo=tzoffset(None, 0))
-
==============================
5.tz를 인식하지 않는 datetime과 tz를 인식하는 datetime을 비교할 때 문제가 발생할 수 있으므로 시간대 정보를주의 깊게 관찰해야합니다.
tz를 인식하지 않는 datetime과 tz를 인식하는 datetime을 비교할 때 문제가 발생할 수 있으므로 시간대 정보를주의 깊게 관찰해야합니다.
왜 그렇게 사용하지 않는지 알지 못한다면 항상 tz-aware로 만드는 것이 가장 좋습니다 (utc로만 사용하는 경우조차도).
#----------------------------------------------- import datetime import pytz import dateutil.parser #----------------------------------------------- utc = pytz.utc BERLIN = pytz.timezone('Europe/Berlin') #----------------------------------------------- def to_iso8601(when=None, tz=BERLIN): if not when: when = datetime.datetime.now(tz) if not when.tzinfo: when = tz.localize(when) _when = when.strftime("%Y-%m-%dT%H:%M:%S.%f%z") return _when[:-8] + _when[-5:] # remove microseconds #----------------------------------------------- def from_iso8601(when=None, tz=BERLIN): _when = dateutil.parser.parse(when) if not _when.tzinfo: _when = tz.localize(_when) return _when #-----------------------------------------------
-
==============================
6.나는 아직 시도하지 않았지만, pyiso8601은 이것을 지원할 것을 약속한다.
나는 아직 시도하지 않았지만, pyiso8601은 이것을 지원할 것을 약속한다.
-
==============================
7.
import datetime, time def convert_enddate_to_seconds(self, ts): """Takes ISO 8601 format(string) and converts into epoch time.""" dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')+\ datetime.timedelta(hours=int(ts[-5:-3]), minutes=int(ts[-2:]))*int(ts[-6:-5]+'1') seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0 return seconds
여기에는 밀리 초 및 시간대도 포함됩니다.
시간이 '2012-09-30T15 : 31 : 50.262-08 : 00'인 경우이 시간은 획기적인 시간으로 변환됩니다.
>>> import datetime, time >>> ts = '2012-09-30T15:31:50.262-08:00' >>> dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')+ datetime.timedelta(hours=int(ts[-5:-3]), minutes=int(ts[-2:]))*int(ts[-6:-5]+'1') >>> seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0 >>> seconds 1348990310.26
-
==============================
8.Isodate는 가장 완벽한 지원을받는 것으로 보입니다.
Isodate는 가장 완벽한 지원을받는 것으로 보입니다.
-
==============================
9.두 가지 방법 :
두 가지 방법 :
Epoch에서 ISO 시간까지 :
isoTime = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime(epochTime))
ISO 기준 시간 :
epochTime = time.mktime(time.strptime(isoTime, '%Y-%m-%dT%H:%M:%SZ'))
-
==============================
10.aniso8601이이를 처리해야합니다. 그것은 또한 시간대, python2 및 python3을 이해하고 ISO8601의 나머지 부분에 대해 합당한 적용 범위를 가지고 있습니다.
aniso8601이이를 처리해야합니다. 그것은 또한 시간대, python2 및 python3을 이해하고 ISO8601의 나머지 부분에 대해 합당한 적용 범위를 가지고 있습니다.
import aniso8601 aniso8601.parse_datetime('2007-03-04T21:08:12')
-
==============================
11.이러한 종류의 전환을 수행하는 가장 간단한 방법은 다음과 같습니다. 파싱 또는 추가 라이브러리가 필요하지 않습니다. 깨끗하고 단순하며 빠릅니다.
이러한 종류의 전환을 수행하는 가장 간단한 방법은 다음과 같습니다. 파싱 또는 추가 라이브러리가 필요하지 않습니다. 깨끗하고 단순하며 빠릅니다.
import datetime import time ################################################ # # Takes the time (in seconds), # and returns a string of the time in ISO8601 format. # Note: Timezone is UTC # ################################################ def TimeToISO8601(seconds): strKv = datetime.datetime.fromtimestamp(seconds).strftime('%Y-%m-%d') strKv = strKv + "T" strKv = strKv + datetime.datetime.fromtimestamp(seconds).strftime('%H:%M:%S') strKv = strKv +"Z" return strKv ################################################ # # Takes a string of the time in ISO8601 format, # and returns the time (in seconds). # Note: Timezone is UTC # ################################################ def ISO8601ToTime(strISOTime): K1 = 0 K2 = 9999999999 K3 = 0 counter = 0 while counter < 95: K3 = (K1 + K2) / 2 strK4 = TimeToISO8601(K3) if strK4 < strISOTime: K1 = K3 if strK4 > strISOTime: K2 = K3 counter = counter + 1 return K3 ################################################ # # Takes a string of the time in ISO8601 (UTC) format, # and returns a python DateTime object. # Note: returned value is your local time zone. # ################################################ def ISO8601ToDateTime(strISOTime): return time.gmtime(ISO8601ToTime(strISOTime)) #To test: Test = "2014-09-27T12:05:06.9876" print ("The test value is: " + Test) Ans = ISO8601ToTime(Test) print ("The answer in seconds is: " + str(Ans)) print ("And a Python datetime object is: " + str(ISO8601ToDateTime(Test)))
from https://stackoverflow.com/questions/969285/how-do-i-translate-an-iso-8601-datetime-string-into-a-python-datetime-object by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 피팅 분배, 적합성, p- 값. Scipy (Python)로이 작업을 수행 할 수 있습니까? (0) | 2018.10.24 |
---|---|
[PYTHON] 모든 이중 밑줄 변수 목록 찾기? (0) | 2018.10.24 |
[PYTHON] 파이썬 요청 모듈에 헤더 추가하기 (0) | 2018.10.24 |
[PYTHON] 파이썬과 ctypes : DLL에 "pointer-to-pointer"를 올바르게 전달하는 방법은 무엇입니까? (0) | 2018.10.23 |
[PYTHON] Python - ISO 8601로 날짜 변환 (0) | 2018.10.23 |