Qual è il modo standard per aggiungere N secondi datetime.Python?
Domanda
Dato un datetime.time
valore in Python, c'è un modo standard per aggiungere un numero intero di secondi, in modo che 11:34:59
+ 3 = 11:35:02
, per esempio?
A queste evidenti le idee non funzionano:
>>> datetime.time(11, 34, 59) + 3
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'int'
>>> datetime.time(11, 34, 59) + datetime.timedelta(0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'
>>> datetime.time(11, 34, 59) + datetime.time(0, 0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.time'
Alla fine ho scritto funziona in questo modo:
def add_secs_to_time(timeval, secs_to_add):
secs = timeval.hour * 3600 + timeval.minute * 60 + timeval.second
secs += secs_to_add
return datetime.time(secs // 3600, (secs % 3600) // 60, secs % 60)
Penso che mi manca in un modo più semplice per fare questo, però.
Correlati
Soluzione
È possibile utilizzare a pieno datetime
le variabili con timedelta
, e fornendo un manichino data di utilizzo time
per ottenere il valore del tempo.
Per esempio:
import datetime
a = datetime.datetime(100,1,1,11,34,59)
b = a + datetime.timedelta(0,3) # days, seconds, then other fields.
print a.time()
print b.time()
risultati i valori di due, tre secondi di distanza:
11:34:59
11:35:02
Si potrebbe anche optare per il più leggibile
b = a + datetime.timedelta(seconds=3)
se sei così inclinato.
Se siete dopo una funzione che può fare questo, si può guardare in utilizzando addSecs
sotto:
import datetime
def addSecs(tm, secs):
fulldate = datetime.datetime(100, 1, 1, tm.hour, tm.minute, tm.second)
fulldate = fulldate + datetime.timedelta(seconds=secs)
return fulldate.time()
a = datetime.datetime.now().time()
b = addSecs(a, 300)
print a
print b
Questo output:
09:11:55.775695
09:16:55
Altri suggerimenti
Come altri hanno detto, si può semplicemente utilizzare oggetti datetime tutto:
sometime = get_some_time() # the time to which you want to add 3 seconds
later = (datetime.combine(date.today(), sometime) + timedelta(seconds=3)).time()
Tuttavia, penso che vale la pena di spiegare perché la full datetime oggetti necessari.Considerare che cosa accadrebbe se ho aggiunto 2 ore alle 11 di sera.Qual è il comportamento corretto?Un'eccezione, perché non si può avere un tempo maggiore di 11:59 pm?Dovrebbe avvolgere di nuovo in giro?
Diversi i programmatori si aspettano cose diverse, a seconda di quale risultato hanno preso a sorprendere un sacco di gente.Peggio ancora, i programmatori di scrivere codice che ha lavorato bene quando hanno provato inizialmente, poi pausa poi facendo qualcosa di inaspettato.Questo è molto male, che è il motivo per cui non ti è permesso di aggiungere timedelta oggetti di oggetti.
Una piccola cosa, si potrebbe aggiungere chiarezza per sostituire il valore predefinito per i secondi
>>> b = a + datetime.timedelta(seconds=3000)
>>> b
datetime.datetime(1, 1, 1, 12, 24, 59)
Grazie a @Pax Diablo, @bvmou e @Aracnide per il suggerimento di usare datetimes tutto.Se devo accettare datetime.oggetti da una fonte esterna, quindi questo sembra essere un'alternativa add_secs_to_time()
funzione:
def add_secs_to_time(timeval, secs_to_add):
dummy_date = datetime.date(1, 1, 1)
full_datetime = datetime.datetime.combine(dummy_date, timeval)
added_datetime = full_datetime + datetime.timedelta(seconds=secs_to_add)
return added_datetime.time()
Questo dettagliato codice può essere compressa fino a questa riga:
(datetime.datetime.combine(datetime.date(1, 1, 1), timeval) + datetime.timedelta(seconds=secs_to_add)).time()
ma penso che voglio avvolgere in una funzione di codice di chiarezza in ogni caso.
Se vale la pena di aggiungere un altro file / dipendenza per il tuo progetto, ho appena scritto una piccola classe che estende datetime.time
con la capacità di eseguire operazioni aritmetiche.Quando si va oltre la mezzanotte, si avvolge attorno allo zero.Ora, "che tempo Che sarà, a 24 ore da adesso" ha un sacco di casi, tra cui l'ora legale, secondi, storico fuso orario cambia, e così via.Ma a volte è davvero bisogno di un semplice caso, ed è quello che farà questo.
Il tuo esempio potrebbe essere scritto:
>>> import datetime
>>> import nptime
>>> nptime.nptime(11, 34, 59) + datetime.timedelta(0, 3)
nptime(11, 35, 2)
nptime
eredita da datetime.time
, in modo che qualsiasi di questi metodi dovrebbero essere utilizzabile, troppo.
E ' disponibile da PyPi come nptime
("non pedante tempo"), o su GitHub: https://github.com/tgs/nptime
Non si può semplicemente aggiungere il numero di datetime
perché è chiaro che unità di misura è utilizzata:pochi secondi, ore, settimane...
C'è timedelta
classe per le manipolazioni con data e ora. datetime
meno datetime
dà timedelta
, datetime
plus timedelta
dà datetime
, due datetime
gli oggetti non possono essere aggiunti anche se due timedelta
possibile.
Creare timedelta
oggetto come il numero di secondi che si desidera aggiungere e aggiungere datetime
oggetto:
>>> from datetime import datetime, timedelta
>>> t = datetime.now() + timedelta(seconds=3000)
>>> print(t)
datetime.datetime(2018, 1, 17, 21, 47, 13, 90244)
C'è lo stesso concetto in C++: std::chrono::duration
.
Per completezza, ecco il modo per farlo con arrow
a (migliore di date e orari per Python):
sometime = arrow.now()
abitlater = sometime.shift(seconds=3)
Prova ad aggiungere un datetime.datetime
per un datetime.timedelta
.Se si desidera solo la porzione di tempo, è possibile chiamare il time()
metodo risultante datetime.datetime
oggetto per farlo.