2010-05-07 13 views
35

Come si calcola la differenza di tempo in minuti per il seguente timestamp in Python?Differenza di data in minuti in Python

2010-01-01 17:31:22 
2010-01-03 17:31:22 
+6

non è sicuro se è possibile, ma si dovrebbe cambiare la tua risposta accettata dal momento che quello che hai scelto non funziona in tutti i casi, e potrebbe causare problemi di persone. –

risposta

-4
from datetime import datetime 

fmt = '%Y-%m-%d %H:%M:%S' 
d1 = datetime.strptime('2010-01-01 17:31:22', fmt) 
d2 = datetime.strptime('2010-01-03 17:31:22', fmt) 

print (d2-d1).days * 24 * 60 
+8

Questo non converte il che a differenza di minuti, ad esempio con i seguenti datetimes: datetime(2005, 7, 14, 18, 30) - datetime(2005, 7, 14, 15, 30) sarà solo dare indietro 0 –

+2

@ Sam S vedere la mia risposta qui sotto in cui gestisce il caso si fa riferimento. –

6

Usa datetime.strptime() per analizzare in istanze datetime, e quindi calcolare la differenza, e infine convertire la differenza in minuti.

0

Come è stato già detto tipo di, è necessario utilizzare datetime.datetime'sstrptime metodo:

from datetime import datetime 

fmt = '%Y-%m-%d %H:%M:%S' 
d1 = datetime.strptime('2010-01-01 17:31:22', fmt) 
d2 = datetime.strptime('2010-01-03 17:31:22', fmt) 

daysDiff = (d2-d1).days 

# convert days to minutes 
minutesDiff = daysDiff * 24 * 60 

print minutesDiff 
61

RSabet's answer non funziona nei casi in cui le date non hanno la stessa ora esatta.

problema originale:

from datetime import datetime 

fmt = '%Y-%m-%d %H:%M:%S' 
d1 = datetime.strptime('2010-01-01 17:31:22', fmt) 
d2 = datetime.strptime('2010-01-03 17:31:22', fmt) 

daysDiff = (d2-d1).days 
print daysDiff 
> 2 

# Convert days to minutes 
minutesDiff = daysDiff * 24 * 60 

print minutesDiff 
> 2880 

d2-d1 ti dà un datetime.timedelta e quando si utilizzano giorni solo si mostrerà i giorni nel timedelta. In questo caso funziona bene, ma se tu avessi il seguente.

from datetime import datetime 

fmt = '%Y-%m-%d %H:%M:%S' 
d1 = datetime.strptime('2010-01-01 16:31:22', fmt) 
d2 = datetime.strptime('2010-01-03 20:15:14', fmt) 

daysDiff = (d2-d1).days 
print daysDiff 
> 2 

# Convert days to minutes 
minutesDiff = daysDiff * 24 * 60 

print minutesDiff 
> 2880 # that is wrong 

Ti avrebbe comunque dato la stessa risposta poiché restituisce ancora 2 per giorni; ignora l'ora, il minimo e il secondo dal timedelta.

Un approccio migliore sarebbe convertire le date in un formato comune e quindi eseguire il calcolo. Il modo più semplice per farlo è convertirli in timestamp Unix. Ecco il codice per farlo.

from datetime import datetime 
import time 

fmt = '%Y-%m-%d %H:%M:%S' 
d1 = datetime.strptime('2010-01-01 17:31:22', fmt) 
d2 = datetime.strptime('2010-01-03 20:15:14', fmt) 

# Convert to Unix timestamp 
d1_ts = time.mktime(d1.timetuple()) 
d2_ts = time.mktime(d2.timetuple()) 

# They are now in seconds, subtract and then divide by 60 to get minutes. 
print int(d2_ts-d1_ts)/60 
> 3043 # Much better 
+0

Great Answer @ken :) –

+0

Questo non funziona per me, ho due valori che sono in genere 50-100 secondi l'uno dall'altro, ma quando lo uso restituisce un valore nell'intervallo da -17K a -18K. qualche idea del perché questo possa essere? (Sto usando il codice esattamente come scritto, tranne le date date sono diverse). – thnkwthprtls

+0

'time.mktime()' può prendere in considerazione le modifiche dell'offset locale dell'utc su alcune piattaforme (potrebbe anche non riuscire se l'input è un tempo locale ambiguo come durante una transizione di fine dell'ora legale). Per ottenere risultati coerenti su tutte le piattaforme, è possibile utilizzare i fusi orari 'pytz' (come restituiti dalla chiamata' tzlocal.get_localzone() ') per ottenere oggetti datetime consapevoli - per ottenere il tempo trascorso corretto (ignorando i secondi bisestili). – jfs

3

Per calcolare con una diversa data di tempo:

from datetime import datetime 

fmt = '%Y-%m-%d %H:%M:%S' 
d1 = datetime.strptime('2010-01-01 16:31:22', fmt) 
d2 = datetime.strptime('2010-01-03 20:15:14', fmt) 

diff = d2-d1 
diff_minutes = diff.seconds/60 
+5

Questo metodo non è corretto, ignora la differenza in giorni. – Moberg

15

Nel caso qualcuno non se ne accorge, un modo per farlo sarebbe quello di combinare Christophe e RSabet delle risposte:

from datetime import datetime 
import time 

fmt = '%Y-%m-%d %H:%M:%S' 
d1 = datetime.strptime('2010-01-01 17:31:22', fmt) 
d2 = datetime.strptime('2010-01-03 20:15:14', fmt) 

diff = d2 -d1 
diff_minutes = (diff.days * 24 * 60) + (diff.seconds/60) 

print(diff_minutes) 
> 3043 
+0

questo metodo fallisce se l'utc corrispondente a 'd1' è diverso da quello per' d2'. Per prendere in considerazione l'offset dell'utc, vedere la soluzione in [@Ken risposta di Cochrane e il mio commento lì] (http://stackoverflow.com/a/6879077/4279) – jfs

2

Il risultato dipende dal fuso orario che corrisponde alle stringhe del tempo di input.

Il caso più semplice, se entrambe le date utilizzano compensare lo stesso UTC:

#!/usr/bin/env python3 
from datetime import datetime, timedelta 

time_format = "%Y-%d-%m %H:%M:%S" 
dt1 = datetime.strptime("2010-01-01 17:31:22", time_format) 
dt2 = datetime.strptime("2010-01-03 17:31:22", time_format) 
print((dt2 - dt1) // timedelta(minutes=1)) # minutes 

Se la versione di Python non supporta td // timedelta; sostituirlo con int(td.total_seconds() // 60).

Se il tempo di ingresso è nel fuso orario locale che potrebbe avere compensato in tempi diversi ad esempio UTC diversa, ha ora legale allora si dovrebbe fare dt1, dt2 in oggetti datetime consapevoli prima di trovare la differenza, per tener conto della possibili cambiamenti nell'offset dell'utc.

Il modo portabile per fare un sensibilizzare oggetti datetime locali è utilizzare pytz timezones:

#!/usr/bin/env python 
from datetime import timedelta 
import tzlocal # $ pip install tzlocal 

local_tz = tzlocal.get_localzone() # get pytz timezone 
aware_dt1, aware_dt2 = map(local_tz.localize, [dt1, dt2]) 
td = aware_dt2 - aware_dt1 # elapsed time 

Se uno o dt1dt2 corrispondono ad un tempo ambigua poi il difetto is_dst=False viene usato per disambiguare. È possibile impostare is_dst=None per generare un'eccezione per le ore locali ambigue o inesistenti.

Se non è possibile installare moduli di terze parti allora time.mktime() could be used from @Ken Cochrane's answer che può trovare l'offset utc corretto su alcune piattaforme per alcune date in alcuni fusi orari - se non è necessario un risultato coerente (ma forse errato), allora è molto meglio di fare dt2 - dt1 con oggetti datetime ingenui che falliscono sempre se i corrispondenti offset utc sono diversi.

+0

Dopo aver letto la risposta ho capito il tuo punto. Bello! – moooeeeep

29
minutes_diff = (datetime_end - datetime_start).total_seconds()/60.0 
+1

Ottima e semplice risposta; Vorrei aggiungere l'avvertenza che questo presuppone che 'datetime_end' e' datetime_start' siano già analizzati in oggetti 'datetime'. La sottrazione produce un'istanza 'timedelta'. – oarevalo

0

In Altri modi per ottenere la differenza tra la data;

import dateutil.parser 
import datetime 

timeDifference = current_date - dateutil.parser.parse(last_sent_date) 
time_difference_in_minutes = (int(timeDifference.days) * 24 * 60) + int((timeDifference.seconds)/60) 

Grazie

Problemi correlati