2013-08-27 12 views
17

Faccio un calcolo del tempo medio e vorrei visualizzare la media risultante senza microsecondi.Python timedelta remove microseconds

avg = sum(datetimes, datetime.timedelta(0))/len(datetimes) 

Grazie

+0

ciò che è 'datetimes' ... un elenco di timedeltas? In tal caso, la somma restituisce un oggetto timedelta che include microsecondi ... quindi qual è il problema? – tdelaney

+0

'avg.strftime ("% Y-% m-% d% H:% M:% S ")', ma restituirà stringa. –

risposta

19

Prendere la timedetla e rimuovere i propri microsecondi, come microsecondi e attributo di sola lettura:

avg = sum(datetimes, datetime.timedelta(0))/len(datetimes) 
avg = avg - datetime.timedelta(microseconds=avg.microseconds) 

È possibile rendere il proprio piccolo funzione se si tratta di una necessità ricorrente:

import datetime 

def chop_microseconds(delta): 
    return delta - datetime.timedelta(microseconds=delta.microseconds) 

Non ho trovato una soluzione migliore.

+5

Dovrebbe essere "microsecondo", per quanto posso dire. – daviewales

+0

dovrebbe essere 'microsecondi'. Prova [qui] (http://pastebin.com/P4qH1G51) –

+1

È 'microsecondi' su oggetti timedelta, ma' microsecondi' su oggetti temporali e datetime. –

12

Se è solo per il display, questa idea funziona:

avgString = str(avg).split(".")[0] 

L'idea è quella di prendere solo ciò che è prima del punto. Si tornerà 01:23:45 per 01: 23: 45,1235

2

un'altra opzione, dato timedetla si può fare:

avg = datetime.timedelta(seconds=math.ceil(avg.total_seconds())) 

è possibile sostituire il math.ceil(), con math.round() o math.floor(), dipende dalla situazione.

3

è possibile modificare gli elementi della datetimes in questo modo:

In [1]: datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) 
Out[1]: datetime.datetime(2017, 4, 28, 0, 0)