2012-05-19 18 views
29

Ho bisogno di convertire le stringhe di valori temporali indicati nella seguente formato per seconds.I sto usando python2.6conversione di una stringa di tempo per secondi in python

esempio:

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 

Devo usare regex per fare questo? ho cercato di utilizzare il modulo di tempo, ma time.strptime('00:00:00,000','%I:%M:%S') buttato

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

qualcuno può dirmi come questo può essere risolto?

Edit:

Penso

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

dà la corretta value..I stava usando il modulo errato

+3

Non è necessario usare 'datatime.datetime.strptime',' time.strptime' lavora per quello pure, non è solo nella documentazione per qualche motivo ... – Josiah

risposta

39

Per 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

Sembra che si è disposti a striscia frazioni di secondo .. . il problema è che non si può usare '00' come l'ora 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

C'è sempre l'analisi di 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 fare le cose a mano in Python: p – jamylak

24

Un po 'più divinatorio penso sarebbe:

timestr = '00:04:23' 

ftr = [3600,60,1] 

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

uscita è 263Sec.

Sarei interessato a vedere se qualcuno potrebbe semplificare ulteriormente.

+1

La comprensione delle liste è più pitonica. Quindi 'sum ([a * b per a, b in zip (ftr, [int (i) per i in timestr.split (": ")])])' sarebbe più pythonic. – inspectorG4dget

+0

non dovrebbe essere 263? –

+1

Grazie Le Vieux Gildas .. dovrebbe essere 263 .. ftr non dovrebbe essere stato [3600,60,0] .. deve essere [3600,60,1] ... grazie agian – user1721943

3

Per ottenere timedelta(), si dovrebbe sottrarre 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 sopra implica l'ingresso è meno di un giorno, per sostenere la differenza di tempo più di un giorno:

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

Per emulare .total_seconds() su Python 2.6:

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

senza importazioni

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

Ottima risposta, piccola regolazione da in grado di gestire entrambi i formati mm: ss e hh: mm: ss in modo corretto, basta invertire lo split .sum (x * int (t) per x, t in zip ([1, 60, 3600], invertito (time.split (":")))) ' –

Problemi correlati