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
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
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
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 –
@ Sam S vedere la mia risposta qui sotto in cui gestisce il caso si fa riferimento. –
Usa datetime.strptime()
per analizzare in istanze datetime, e quindi calcolare la differenza, e infine convertire la differenza in minuti.
Come è stato già detto tipo di, è necessario utilizzare datetime.datetime's
strptime
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
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
Great Answer @ken :) –
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
'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
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
Questo metodo non è corretto, ignora la differenza in giorni. – Moberg
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
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
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 dt1
dt2
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.
Dopo aver letto la risposta ho capito il tuo punto. Bello! – moooeeeep
minutes_diff = (datetime_end - datetime_start).total_seconds()/60.0
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
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
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. –