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


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.