복붙노트

[PYTHON] ISO 8601 datetime 문자열을 Python datetime 객체로 변환하려면 어떻게해야합니까? [복제]

PYTHON

ISO 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. ==============================

    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.파이썬 2.5 :

    파이썬 2.5 :

    datetime.datetime.strptime("2007-03-04T21:08:12", "%Y-%m-%dT%H:%M:%S")
    
  3. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    6.나는 아직 시도하지 않았지만, pyiso8601은 이것을 지원할 것을 약속한다.

    나는 아직 시도하지 않았지만, pyiso8601은 이것을 지원할 것을 약속한다.

  7. ==============================

    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. ==============================

    8.Isodate는 가장 완벽한 지원을받는 것으로 보입니다.

    Isodate는 가장 완벽한 지원을받는 것으로 보입니다.

  9. ==============================

    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. ==============================

    10.aniso8601이이를 처리해야합니다. 그것은 또한 시간대, python2 및 python3을 이해하고 ISO8601의 나머지 부분에 대해 합당한 적용 범위를 가지고 있습니다.

    aniso8601이이를 처리해야합니다. 그것은 또한 시간대, python2 및 python3을 이해하고 ISO8601의 나머지 부분에 대해 합당한 적용 범위를 가지고 있습니다.

    import aniso8601
    aniso8601.parse_datetime('2007-03-04T21:08:12')
    
  11. ==============================

    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)))
    
  12. 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