밀리 초가 포함 된 시간 문자열을 파이썬으로 파싱하려면 어떻게해야합니까?


204

날짜 / 시간이 포함 된 문자열을 time.strptime 으로 구문 분석 할 수 있습니다.

>>> import time
>>> time.strptime('30/03/09 16:31:32', '%d/%m/%y %H:%M:%S')
(2009, 3, 30, 16, 31, 32, 0, 89, -1)

밀리 초가 포함 된 시간 문자열을 어떻게 구문 분석 할 수 있습니까?

>>> time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/_strptime.py", line 333, in strptime
    data_string[found.end():])
ValueError: unconverted data remains: .123

답변:


318

Python 2.6에는 새로운 strftime / strptime 매크로가 추가되어 %f마이크로 초를 수행합니다. 이것이 어디에나 문서화되어 있는지 확실하지 않습니다. 그러나 2.6 또는 3.0을 사용하는 경우 다음을 수행 할 수 있습니다.

time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f')

편집 : 나는 실제로 time모듈로 작업 하지 않으므로 처음에는 이것을 알지 못했지만 그 시간이 나타납니다 .struct_time은 실제로 밀리 초 / 마이크로 초를 저장하지 않습니다. 다음 datetime과 같이을 사용하는 것이 좋습니다 .

>>> from datetime import datetime
>>> a = datetime.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f')
>>> a.microsecond
123000

4
감사합니다 docs.python.org/library/datetime.html : 버전 2.6의 새로운 기능 : time 및 datetime 객체는 객체의 마이크로 초 수로 확장되는 % f 형식 코드를 지원하며 왼쪽에서 6 자리까지 0으로 채워집니다.
— ilkinulas

5
파이썬 문서를 업데이트해야한다고 말할 수 있습니다. 시간 모듈에 대한 문서는에 대해 아무 말도하지 않습니다 %f.
— phunehehe

14
버전 2.7.3부터 Python 문서는 약간 오해의 소지가 있습니다. strptime의 경우 % f는 실제로 6 초가 아닌 소수 자릿수를 나타낼 수 있습니다. 마이크로 초를 예상 할 수 있습니다. 따라서 위의 코드는 32.123 초를 구문 분석하여 123,000µs로 저장합니다.
— Michael Scheper

9
숫자 %f는 오른쪽 (왼쪽이 아님)에서 소수점 이하 6 자리까지 0으로 채워집니다 . (1) (12)은 120000로 해석됩니다, 100000 분석하고, 1234567 생산됩니다ValueError: unconverted data remains: 7
— user443854

17
그것은 단지 나입니까, 마이크로 초가 아닌 밀리 초에 관한 질문입니까?
— Purrell

12

나는 이것이 오래된 질문이라는 것을 알고 있지만 여전히 Python 2.4.3을 사용하고 있으며 데이터 문자열을 날짜 시간으로 변환하는 더 좋은 방법을 찾아야했습니다.

datetime이 % f를 지원하지 않고 시도 / 제외가없는 경우의 해결책은 다음과 같습니다.

    (dt, mSecs) = row[5].strip().split(".") 
    dt = datetime.datetime(*time.strptime(dt, "%Y-%m-%d %H:%M:%S")[0:6])
    mSeconds = datetime.timedelta(microseconds = int(mSecs))
    fullDateTime = dt + mSeconds 

입력 문자열 "2010-10-06 09 : 42 : 52.266000"에서 작동합니다.


1
dt.replace(microsecond=int(mSecs))
— haridsv

이것은 Python 2.5 및 이전 버전에 적용됩니다. 파이썬 2.6 지지체 strptime '% F'
— SMCI

4

nstehr의 답변 이 소스 에서 참조 하는 코드를 제공하려면 다음을 수행하십시오 .

def timeparse(t, format):
    """Parse a time string that might contain fractions of a second.

    Fractional seconds are supported using a fragile, miserable hack.
    Given a time string like '02:03:04.234234' and a format string of
    '%H:%M:%S', time.strptime() will raise a ValueError with this
    message: 'unconverted data remains: .234234'.  If %S is in the
    format string and the ValueError matches as above, a datetime
    object will be created from the part that matches and the
    microseconds in the time string.
    """
    try:
        return datetime.datetime(*time.strptime(t, format)[0:6]).time()
    except ValueError, msg:
        if "%S" in format:
            msg = str(msg)
            mat = re.match(r"unconverted data remains:"
                           " \.([0-9]{1,6})$", msg)
            if mat is not None:
                # fractional seconds are present - this is the style
                # used by datetime's isoformat() method
                frac = "." + mat.group(1)
                t = t[:-len(frac)]
                t = datetime.datetime(*time.strptime(t, format)[0:6])
                microsecond = int(float(frac)*1e6)
                return t.replace(microsecond=microsecond)
            else:
                mat = re.match(r"unconverted data remains:"
                               " \,([0-9]{3,3})$", msg)
                if mat is not None:
                    # fractional seconds are present - this is the style
                    # used by the logging module
                    frac = "." + mat.group(1)
                    t = t[:-len(frac)]
                    t = datetime.datetime(*time.strptime(t, format)[0:6])
                    microsecond = int(float(frac)*1e6)
                    return t.replace(microsecond=microsecond)

        raise

2

위의 DNS 답변 은 실제로 잘못되었습니다. SO는 약 밀리 초를 요구하지만 대답은 마이크로 초입니다. 불행히도 파이썬에는 밀리 초에 대한 지시문이 없으며 마이크로 초 ( doc 참조 )가 있지만 문자열 끝에 3 개의 0을 추가하고 문자열을 마이크로 초로 파싱하여 해결할 수 있습니다.

datetime.strptime(time_str + '000', '%d/%m/%y %H:%M:%S.%f')

여기서 time_str같은 형식입니다 30/03/09 16:31:32.123.

도움이 되었기를 바랍니다.


2
나는 처음에는 같은 것을 생각했지만 대답과 문서 에 대한 의견을 봅니다 . 그것은 것 왼쪽 제로 패딩 마이크로 때문에 .123제대로 123,000 마이크로로 해석됩니다
— aschmied

1

내 첫 번째 생각은 '30 / 03 / 09 16 : 31 : 32.123 '(초와 밀리 초 사이의 콜론 대신 마침표)을 전달하려고 시도했지만 작동하지 않았습니다. 문서를 한 눈에 살펴보면 어떤 경우에도 분수 초가 무시된다는 것을 나타냅니다 ...

아, 버전 차이. 이것은 버그 로 보고 되었으며 2.6 이상에서는 "% S. % f"를 사용하여 구문 분석 할 수 있습니다.


작동하지 않습니다. time.strptime은 밀리 초를 수행하지 않습니다.
— DNS

1

파이썬 메일 링리스트에서 : 파싱 ​​밀리 초 스레드 . 저자의 의견에서 언급했듯이 일종의 해킹이지만 작업을 수행하는 것처럼 보이는 기능이 게시되어 있습니다. 정규식을 사용하여 발생하는 예외를 처리 한 다음 일부 계산을 수행합니다.

strptime에 전달하기 전에 정규식과 계산을 미리 시도 할 수도 있습니다.


예, 그 스레드를 알고 있습니다. 그러나 나는 더 간단한 방법을 찾고 있습니다. python lib에 밀리 초로 시간을 파싱하는 모듈이 있습니까?
— ilkinulas

1

파이썬 2의 경우 나는 이것을했다.

print ( time.strftime("%H:%M:%S", time.localtime(time.time())) + "." + str(time.time()).split(".",1)[1])

"% H : % M : % S"시간을 인쇄하고 time.time ()을 두 개의 하위 문자열 (. 전후)로 분할합니다. xxxxxxx.xx .xx는 밀리 초이므로 두 번째 하위 문자열을 ""에 추가합니다. H : % M : % S "

이해가 되길 바랍니다 :) 예제 출력 :

13 : 31 : 21.72 깜박임 01


13 : 31 : 21.81 점멸 종료 01


13 : 31 : 26.3 깜박임 01


13 : 31 : 26.39 깜박임의 끝 01


13 : 31 : 34.65 레인 01 시작


당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.