2012-08-22 8 views
5

Mam do czynienia z dużą ilością danych, które mają zarówno wartości, jak i czasy (w ciągach).Jak radzić sobie z wartościami czasu przekraczającymi 24 godziny w pythonie?

jestem konwersji wartości czasowych ciągów na wartości datetime z następującego kodu:

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

Jedynym problemem jest to, że niektóre z moich danych ma format: 24: 00: 00.004.
Więc niektóre dane jest rzeczywiście w ciągu 24 godzin

Python daje mi ten błąd: ValueError: czas data '24: 00: 00: 004' nie pasuje do formatu '% H:% M:% S. % f”

Wszelkie pomysły, w jaki sposób radzić sobie z tym problemem

Odpowiedz

8

parametr %H można tylko analizować wartości w przedziale 0-23. Będziesz musiał ręcznie czynienia z tych specyficznych znaczników czasu:

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

To szczęście, że przed tymi godzinami było miejsce, aby zezwolić na użycie 'replace' zamiast jakiegoś bardziej brzydkiego rozwiązania używając' re'. – mgilson

+2

@mgilson: w takim przypadku użyłbym ''23' + czas [2:]' zamiast tego, być może w połączeniu z 'time.startswith ('24')'. –

+1

'.replace()' ma również parametr 'count'. Często używam tego, aby uniknąć przypadkowych wtórnych wymian. W przypadku braku przestrzeni kosmicznej też mogło to zadziałać. – DSM

2

Spróbuj parsowania godziny oddzielnie:

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

@ J.F.Sebastian dzięki, naprawione. – ecatmur

1

Wygląda dane nie zawierają dat, ale rozpiętości czasu, więc może powinien przechowuj swoje dane jako timedelta zamiast datetime.


Można użyć this funkcję stworzyć timedelta od strun:

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

Przetwarzanie swój ciąg czasowy '24:00:00.004' jak ten

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

spowodowałoby timedelta reprezentowanego lubię to

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

+0

'% f' odpowiada mikrosekundom, nie milisekundom. Nie wywołuj niepotrzebnie 'str() '. – jfs

Powiązane problemy