2012-08-22 16 views
5

Estoy lidiando con una gran cantidad de datos que tienen valores y tiempos (en cadenas).¿Cómo lidiar con los valores de tiempo en 24 horas en python?

Estoy convirtiendo los valores de tiempo de cadena en los valores de fecha y hora con el siguiente código:

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

El único problema es que algunos de mis datos tiene el formato: 24: 00: 00,004.
Así que algunos de los datos es en realidad más de 24 horas

Python es que me da este error: ValueError: Tiempo de datos de 24: 00: 00: 004 'no coincide con el formato'% H:% M:% S. % f'

Cualquier ideas sobre cómo hacer frente a este problema

Respuesta

8

el parámetro %H sólo puede analizar los valores en el rango de 0-23. Vas a tener que tratar de forma manual con los sellos de tiempo específicos:

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

Es una suerte que haya un espacio en frente de las horas aquí para permitir el uso de 'reemplazar' en lugar de una solución más fea con' re'. – mgilson

+2

@mgilson: en cuyo caso, en lugar de eso, habría usado ''23 '+ time [2:]', tal vez combinado con 'time.startswith (' 24 ')'. –

+1

'.replace()' también tiene un parámetro 'count'. A menudo uso eso para evitar reemplazos secundarios accidentales. Para el caso sin espacio, eso podría haber funcionado también. – DSM

2

Trate analizar las horas por separado:

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

@ J.F.Sebastian gracias, arreglado. – ecatmur

1

parece que sus datos no contiene fechas, pero lapsos de tiempo, por lo que debe tal vez almacene sus datos como timedelta en lugar de datetime.


Puede utilizar this función para crear una timedelta de sus cadenas:

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

Analizar la cadena de tiempo '24:00:00.004' como esto

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

resultaría en una timedelta representado como este

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

+0

'% f' coincide con microsegundos, no milisegundos. No llame 'str()' innecesariamente. – jfs

Cuestiones relacionadas