2012-05-19 12 views
29

que necesito para convertir cadenas de valor de tiempo dados en el siguiente formato para seconds.I estoy usando python2.6la conversión de una cadena de tiempo de segundos en Python

por ejemplo:

1.'00:00:00,000' -> 0 seconds 

2.'00:00:10,000' -> 10 seconds 

3.'00:01:04,000' -> 64 seconds 

4. '01:01:09,000' -> 3669 seconds 

¿Es necesario utilizar expresiones regulares para hacer esto? he intentado utilizar módulo de tiempo, pero time.strptime('00:00:00,000','%I:%M:%S') tiró

ValueError: time data '00:00:00,000' does not match format '%I:%M:%S' 

¿puede alguien decirme cómo esto se puede solucionar?

Editar:

creo

pt =datetime.datetime.strptime(timestring,'%H:%M:%S,%f') 
total_seconds = pt.second+pt.minute*60+pt.hour*3600 

da value..I correcta estaba usando el módulo incorrecto

+3

No es necesario usar 'datatime.datetime.strptime',' time.strptime' trabaja para que, así, no es sólo en la documentación por alguna razón ... – Josiah

Respuesta

39

Para Python 2.7:

>>> import datetime 
>>> import time 
>>> x = time.strptime('00:01:00,000'.split(',')[0],'%H:%M:%S') 
>>> datetime.timedelta(hours=x.tm_hour,minutes=x.tm_min,seconds=x.tm_sec).total_seconds() 
60.0 
3

Parece que estás dispuesto a despojar fracciones de segundo .. . el problema es que no se puede utilizar '00' como la hora con %I

>>> time.strptime('00:00:00,000'.split(',')[0],'%H:%M:%S') 
time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1) 
>>> 
2

Siempre está analizando con la mano

>>> import re 
>>> ts = ['00:00:00,000', '00:00:10,000', '00:01:04,000', '01:01:09,000'] 
>>> for t in ts: 
...  times = map(int, re.split(r"[:,]", t)) 
...  print t, times[0]*3600+times[1]*60+times[2]+times[3]/1000. 
... 
00:00:00,000 0.0 
00:00:10,000 10.0 
00:01:04,000 64.0 
01:01:09,000 3669.0 
>>> 
+3

odio haciendo cosas a mano en Python: p – jamylak

24

Un poco más Pythonic Creo que sería:

timestr = '00:04:23' 

ftr = [3600,60,1] 

sum([a*b for a,b in zip(ftr, map(int,timestr.split(':')))]) 

salida es 263Sec.

Me gustaría ver si alguien podría simplificarlo aún más.

+1

Las comprensiones de listas son más pitónicas. Entonces 'sum ([a * b para a, b en zip (ftr, [int (i) para i en timestr.split (": ")])])' sería más pitónico. – inspectorG4dget

+0

¿no debería ser 263? –

+1

Gracias Le Vieux Gildas .. debería ser 263 ... ftr no debería haber sido [3600,60,0] .. debe ser [3600,60,1] ... gracias agian – user1721943

3

Para obtener el timedelta(), usted debe restar 1900-01-01:

>>> from datetime import datetime 
>>> datetime.strptime('01:01:09,000', '%H:%M:%S,%f') 
datetime.datetime(1900, 1, 1, 1, 1, 9) 
>>> td = datetime.strptime('01:01:09,000', '%H:%M:%S,%f') - datetime(1900,1,1) 
>>> td 
datetime.timedelta(0, 3669) 
>>> td.total_seconds() # 2.7+ 
3669.0 

%H anterior implica que la entrada es menos de un día, para apoyar la diferencia de tiempo de más de un día:

>>> import re 
>>> from datetime import timedelta 
>>> td = timedelta(**dict(zip("hours minutes seconds milliseconds".split(), 
...       map(int, re.findall('\d+', '31:01:09,000'))))) 
>>> td 
datetime.timedelta(1, 25269) 
>>> td.total_seconds() 
111669.0 

Para emular .total_seconds() en Python 2.6:

>>> from __future__ import division 
>>> ((td.days * 86400 + td.seconds) * 10**6 + td.microseconds)/10**6 
111669.0 
5

sin importaciones

time = "01:34:11" 
sum(x * int(t) for x, t in zip([3600, 60, 1], time.split(":"))) 
+0

Excelente respuesta, pequeño ajuste para ser capaz de manejar los formatos mm: ss y hh: mm: ss correctamente solo invierta la división 'sum (x * int (t) para x, t en zip ([1, 60, 3600], invertido (time.split (":")))) ' –

Cuestiones relacionadas