2016-01-06 10 views
6

Dire che ho ottenuto una stringa con il formato %H:%M:%S, ad es. 04:35:45. Voglio convertirli nell'oggetto datetime.datetime, anno/mese/giorno sono gli stessi di datetime.datetime.now().Qual è il modo migliore per creare datetime da "% H:% M:% S"

ho cercato

now = datetime.now() 
datetime_obj = datetime.strptime(time_string, "%H:%M:%S") 
datetime_obj.year = now.year 
datetime_obj.month = now.month 
datetime_obj.day = now.day 

Questo non funziona in quanto year/month/day sono proprietà di sola lettura. Quindi qual è la migliore soluzione per questo?

risposta

7

Volete datetime.combine(date, time):

>>> time = datetime.datetime.strptime("04:35:45", "%H:%M:%S").time() 
>>> time 
datetime.time(4, 35, 45) 
>>> day = datetime.datetime.now().date() 
>>> day 
datetime.date(2016, 1, 6) 
>>> datetime.datetime.combine(day, time) 
datetime.datetime(2016, 1, 6, 4, 35, 45) 
>>> 
+0

Personalmente preferisco questa risposta. – laike9m

4

A terze parti dateutil utilizza la data corrente, in questo caso:

>>> from dateutil.parser import parse 
>>> time_string = "04:35:45" 
>>> parse(time_string) 
datetime.datetime(2016, 1, 6, 4, 35, 45) 

In alternativa, è possibile utilizzare .replace() per impostare l'anno, mese e giorno:

>>> datetime_obj = datetime.strptime(time_string, "%H:%M:%S") 
>>> datetime_obj.replace(year=now.year, month=now.month, day=now.day) 
datetime.datetime(2016, 1, 6, 4, 35, 45) 

Benchè , Mi piace molto il .combine() option pubblicato da Bruno.

+0

Buona. Posso farlo senza lib di terze parti? – laike9m

+0

@ laike9m ok, aggiornato, grazie. – alecxe

1

È possibile utilizzare datetime_obj.replace. Dai documenti:

Restituisce un datetime con gli stessi attributi, ad eccezione di quegli attributi dati nuovi valori in base a qualsiasi argomento della parola chiave specificato.

Ad esempio:

from datetime import datetime 

time_string = "04:35:45" 

now = datetime.now() 
datetime_obj = datetime.strptime(time_string, "%H:%M:%S") 
datetime_obj = datetime_obj.replace(
     year = now.year, 
     month = now.month, 
     day = now.day 
     ) 

print datetime_obj 

che stampa:

2016-01-06 04:35:45 
1

Si potrebbe semplicemente passare il tempo come int a datetime.replace senza bisogno di creare due oggetti datetime:

time_sring = "12:31:33" 
hr, mn, sec = map(int, time_sring.split(":")) 
dtetime_obj = datetime.now().replace(hour=hr, minute=mn, second=sec) 
2016-01-06 12:31:33.439492 
Problemi correlati