2012-08-22 247 views
5

我正在處理大量具有值和時間(字符串)的數據。如何在python中處理超過24小時的時間值?

我將字符串時間值轉換爲datetime值用下面的代碼:

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

唯一的問題是,我的一些數據的格式是:24:00:00.004。
所以一些數據實際上是超過24小時

Python是給我這個錯誤:ValueError異常:時間數據 '24:00:00:004' 不匹配格式'%H:%M:%S。 %F」

對如何處理這個問題

回答

8

%H參數只能在範圍0-23解析值的任何想法。你必須手動將這些特定時間戳處理:

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

很幸運的是,在這裏幾小時前有一個空間允許使用'replace'而不是使用're'的一些更醜陋的解決方案。 – mgilson

+2

@mgilson:在這種情況下,我會使用''23'+ time [2:]'來代替,也許與'time.startswith('24')'結合使用。 –

+1

'.replace()'也有'count'參數。我經常使用它來避免意外的二次替換。對於無空間的情況,這可能也起作用了。 – 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而不是datetime


可以使用this函數來創建你的字符串一個timedelta

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()))) 

解析您的時間字符串'24:00:00.004'這樣

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

會導致代表的timedelta像這樣

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

+0

'%f'匹配微秒,而不是毫秒。不要不必要地調用'str()'。 – jfs

相關問題