2012-08-22 6 views
5

나는 (문자열에서) 값과 시간을 모두 갖는 많은 양의 데이터를 다루고있다.python에서 24 시간 동안의 시간 값을 처리하는 방법은 무엇입니까?

나는 다음과 같은 코드로 날짜 값으로 문자열 시간 값을 변환 오전 : 24 : 00 : 00 : 00.004

time = datetime.datetime.strptime(time, " %H:%M:%S.%f") 

유일한 문제는 내 데이터의 일부는 포맷을 가지고 있다는 것입니다. 에 ValueError : 시간 데이터 '24 : 00 : 00 : 004'형식 '%의 H 일치하지 않습니다 %의 M을 %의 S
그래서 일부 데이터는 실제로 24 시간 이상

파이썬은 나에게이 오류를주고있다. % f를 '이 문제

답변

8

만 0-23 범위의 값을 구문 분석 할 수 %H 매개 변수를 처리하는 방법에 대한

어떤 아이디어. 수동으로 그 특정 타임 스탬프를 처리해야합니다 :

try: 
    time = datetime.datetime.strptime(time, " %H:%M:%S.%f") 
except ValueError: 
    time = time.replace(' 24', ' 23') 
    time = datetime.datetime.strptime(time, " %H:%M:%S.%f") 
    time += datetime.timedelta(hours=1) 
+0

're'을 사용하는 추악한 해결책 대신에'replace'를 사용할 수 있도록 여기에 시간적 여유가 있었기 때문에 운이 좋았습니다. – mgilson

+2

@mgilson :이 경우'23 '+ time [2 :]'대신'time.startswith ('24 ')'를 사용했을 것입니다. –

+1

.replace()'역시'count' 매개 변수를 가지고 있습니다. 나는 우발적 인 2 차 보충을 피하기 위해 그것을 종종 사용한다. 우주 공간이없는 경우에도 효과가있을 수 있습니다. – DSM

2

별도로 시간을 구문 분석을 시도 : 데이터가 날짜를 포함하지 않는 것처럼

hours, rest = time.split(':', 1) 
time = datetime.timedelta(hours=int(hours)) + datetime.datetime.strptime(rest, "%M:%S.%f") 
+0

@ J.F.Sebastian 덕분에 고침. – ecatmur

1

보이지만 시간 범위, 그래서 당신은 어쩌면해야 데이터를 대신 timedelta으로 저장하십시오.


당신은 당신의 문자열에서 timedelta 만들 this 기능을 사용할 수 있습니다

: 대표되는 timedelta 초래이

>>>t = parseTimeDelta('24:00:00.04')

처럼 시간 문자열 '24:00:00.004' 구문 분석

import re 
from datetime import timedelta 

def parseTimeDelta(s): 
    d = re.match(
      r'((?P<days>\d+) days,)?(?P<hours>\d+):' 
      r'(?P<minutes>\d+):(?P<seconds>\d+)\.(?P<milliseconds>\d+)', 
      str(s)).groupdict(0) 
    return timedelta(**dict(((key, int(value)) 
           for key, value in d.items()))) 

을 이쪽처럼

>>> print t
1 day, 0:00:00.004000

+0

'% f '은 (는) 밀리 초가 아니라 마이크로 초와 일치합니다. 'str()'을 불필요하게 호출하지 마라. – jfs

관련 문제