Converti la data in datetime in Python


632

Esiste un metodo integrato per convertire a datein datetimein Python, ad esempio ottenere la datetimeper la mezzanotte della data indicata? La conversione opposta è semplice: datetimeha un .date()metodo.

Devo davvero chiamare manualmente datetime(d.year, d.month, d.day)?


118
Non è una domanda sciocca; gli oggetti data dovrebbero avere un .datetime()metodo; ciò che è sciocco è che non hanno un tale metodo.
Zags il

9
@Zag: o datetime.from_date()costruttore.
jfs,

2
@DavidNemeskey: leggi il commento di Zags a cui il mio commento risponde. Si tratta di quali metodi avrebbero dovuto esistere.
jfs,

2
@JFSebastian: Non ho idea di come mi sia perso ... e sono completamente d'accordo.
David Nemeskey,

7
no non dovrebbe essere una data è un sottoinsieme di datetime (è anche nel nome). Non è chiaro quale sia la data di un datetime. Ma viceversa, una data è un blocco di 24 ore (di solito), quindi può avere molti periodi di tempo. Quale datetime verrebbe da una data? Non puoi sempre così 00:00 perché cosa succede se quell'ora non esiste, come ad esempio l'ora legale l'ha saltato. Non così facile #
dalore

Risposte:


805

Puoi usare datetime.combine(date, time); per il momento, si crea un datetime.timeoggetto inizializzato a mezzanotte.

from datetime import date
from datetime import datetime

dt = datetime.combine(date.today(), datetime.min.time())

79
Grazie. In combinazione con il fatto che time () restituisce (0,0) penso che questo risulti il ​​più pulito:datetime.combine(d, time())
EMP

33
Fai solo attenzione a non lasciare confuso il tuo codice datetime.time () con time.time (). Nomi qualificati FTW!
Dustin,

8
Sì, buon punto. Fortunatamente, combinare () solleva un'eccezione se si passa a time.timeo qualsiasi altra cosa diversa da a datetime.time.
EMP,

21
Per mezzanotte, c'è una costante python in datetime.time.min (2.7.1+) o datetime.min.time () (python precedente)
larham1

16
Buona soluzione, ma non credo che datetime.min.time () sia il modo più pulito per ottenere un'ora 00:00:00. Questo perché ciò che fa è innanzitutto recuperare il valore minimo rappresentabile da datetime e quindi ottenere il suo componente time. Per inciso, datetime.min = datetime (MINYEAR, 1, 1, tzinfo = None) e ha un tempo di 00:00:00. Tuttavia, penso che sia più pulito creare esplicitamente un orario 00:00:00 attraverso time.min o time (0, 0, 0, 0).
Florin Dumitrescu,

130

Esistono diversi modi, anche se credo che quello che menzioni (e non ti piaccia) sia il più leggibile.

>>> t=datetime.date.today()
>>> datetime.datetime.fromordinal(t.toordinal())
datetime.datetime(2009, 12, 20, 0, 0)
>>> datetime.datetime(t.year, t.month, t.day)
datetime.datetime(2009, 12, 20, 0, 0)
>>> datetime.datetime(*t.timetuple()[:-4])
datetime.datetime(2009, 12, 20, 0, 0)

e così via - ma fondamentalmente tutti si basano sull'estrazione appropriata delle informazioni datedall'oggetto e sul loro riporto nel ctor adatto o nella funzione di classe per datetime.


12
Ottimo punto datetime(d.year, d.month, d.day)sembra molto più leggibile della risposta accettata datetime.combine(d, datetime.min.time()).
Simon Tewsi,

2
@SimonTewsi: midnight = datetime.datetime.combine(d, datetime.time.min)sembra più pulito (suggerito da @larham1 )
jfs

2
@JF Sebastian: È un po 'più pulito, ma sono d'accordo con Wes Winham nella sua risposta che richiede al lettore di sapere cosa rappresenta datetime.time.min. Considerando che mi sembra datetime(d.year, d.month, d.day)più ovvio (un datetime senza il componente time). È un punto minore, tuttavia, e l'uso di un nome variabile come "mezzanotte" rende ovvio quale sia il risultato anche se il lettore non sa cosa datetime.time.minrappresenta.
Simon Tewsi,


76

La risposta accettata è corretta, ma preferirei evitare di utilizzarla datetime.min.time()perché non è ovvio per me esattamente cosa fa. Se per te è ovvio, allora più potere per te. Mi sento anche allo stesso modo riguardo al timetuplemetodo e alla dipendenza dall'ordinamento.

A mio avviso, il modo più leggibile ed esplicito per farlo senza fare affidamento sul lettore per avere molta familiarità con l' datetimeAPI del modulo è:

from datetime import date, datetime
today = date.today()
today_with_time = datetime(
    year=today.year, 
    month=today.month,
    day=today.day,
)

Questa è la mia opinione su "esplicito è meglio di implicito".


E una punta di cappello a Kyle Gibson per l'idea originale: stackoverflow.com/users/513197/kyle-gibson
Wes Winham

Sono d'accordo con il tuo sentimento. Tutte queste altre risposte con orari, asterischi e tempo minimo () richiedono ricerche e il modo in cui Python gestisce le date e gli orari è un po 'ingombrante rispetto alla facilità con cui Microsoft li gestisce in VBA. È semplice come avvolgerli in simboli hash in quella lingua. Ma sto divagando.
Bobort,

2
d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day)funzione di risposta di questa risposta.
aliqandil,

Funziona, ma potrebbe essere necessario datetimeessere consapevoli del fuso orario. In tal caso, è possibile import pytze quindi aggiungere tzinfo=pytz.timezone('Europe/London'), ad esempio.
alstr

48

È possibile utilizzare il date.timetuple()metodo e decomprimere l'operatore *.

args = d.timetuple()[:6]
datetime.datetime(*args)

3
Questo è utile per la mia situazione. Non so se è una data o un datetime che sto passando, e non è molto pitonico verificare quale classe sia. Questo metodo sembra funzionare per gli oggetti datetime e date.
Gattster,

Lo datetime.combineusavo prima di scoprire la risposta di @ kiamlaluno. Penso che sia abbastanza pitonico, soprattutto dato che costruire un datetime.timeoggetto probabilmente assomiglierà a qualcosa di simile datetime.time(*map(int,"H:M:S".split(":")))...
Tom

1
Questa è la mia risposta preferita
Nam G VU

8

Oggi 2016, penso che la soluzione più pulita sia fornita da Panda Timestamp:

from datetime import date
import pandas as pd
d = date.today()
pd.Timestamp(d)

Il timestamp è l'equivalente dei panda del datetime ed è intercambiabile con esso nella maggior parte dei casi. Dai un'occhiata:

from datetime import datetime
isinstance(pd.Timestamp(d), datetime)

Ma nel caso in cui desideri davvero un datetime alla vaniglia, puoi comunque fare:

pd.Timestamp(d).to_datetime()

I timestamp sono molto più potenti dei tempi, tra l'altro quando si tratta di fusi orari. In realtà, i timestamp sono così potenti che è un peccato che siano così scarsamente documentati ...


Ottima scelta. Sono venuto qui perché pensavo che avrebbe avuto bisogno di una soluzione datetime python a un problema DatetimeIndex di Panda. Panda vergogna non ha il concetto di un DateIndex.
Tavolini Bobby,

6
perché abbiamo bisogno di un pacchetto pesante solo per manipolare il datetime, anche nel 2016 ?!
cowbert,

Tirare fuori i panda per questo è come portare un martello a una formica
Deji S

5

Un modo per convertire da data a datetime che non è stato ancora menzionato:

from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')

1
È vero, ma convertire ints in stringhe e viceversa è probabilmente un po 'più costoso che lavorare direttamente con ints, quindi
userei


-10

Se hai bisogno di qualcosa di veloce, datetime_object.date()ti dà una data di un oggetto datetime.


8
l'op vuole il contrario, per andare da datea datetime.
Tom,

Dalla domanda: la conversione opposta è semplice: datetimeha un .date()metodo. , grassetto enfasi mio.
Martijn Pieters

-13

Sono un novizio di Python. Ma questo codice ha funzionato per me e converte l'input specificato che fornisco a datetime. Ecco il codice. Correggimi se sbaglio.

import sys
from datetime import datetime
from time import mktime, strptime

user_date = '02/15/1989'
if user_date is not None:
     user_date = datetime.strptime(user_date,"%m/%d/%Y")
else:
     user_date = datetime.now()
print user_date

L'OP ha un datetime.date()oggetto, non una stringa .
Martijn Pieters
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.