1004 Stimmen

Datum in datetime in Python umwandeln

Gibt es eine integrierte Methode zur Konvertierung einer date zu einer datetime in Python, zum Beispiel das Abrufen der datetime für die Mitternacht des angegebenen Datums? Die umgekehrte Umrechnung ist einfach: datetime hat eine .date() Methode.

Muß ich wirklich manuell die datetime(d.year, d.month, d.day) ?

218 Stimmen

Keine dumme Frage; Datumsobjekte sollten eine .datetime() Methode; dumm ist nur, dass sie eine solche Methode nicht haben.

25 Stimmen

@Zags: oder datetime.from_date() Konstrukteur.

15 Stimmen

Nein, es sollte nicht ein Datum ist eine Teilmenge von datetime (es ist sogar im Namen). Es ist eindeutig, was das Datum von einer datetime ist. Aber andersherum ist ein Datum ein Block von 24 Stunden (normalerweise), also kann es viele Datumszeiten haben. Welche Datumszeit würde aus einem Datum entstehen? Man kann nicht immer 00:00 nehmen, denn was ist, wenn es diese Zeit nicht gibt, z. B. weil die Sommerzeit sie übersprungen hat? Nicht so einfach#

1262voto

apaderno Punkte 26483

Sie können verwenden datetime.combine(date, time) ; für die Zeit, die Sie erstellen eine datetime.time Objekt auf Mitternacht initialisiert.

from datetime import date
from datetime import datetime

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

127 Stimmen

Danke! In Verbindung mit der Tatsache, dass time() (0,0) zurückgibt, denke ich, dass dies das sauberste Ergebnis ist: datetime.combine(d, time())

49 Stimmen

Achten Sie nur darauf, dass Ihr Code datetime.time() nicht mit time.time() verwechselt wird. Qualifizierte Namen FTW!

10 Stimmen

Ja, das ist richtig. Glücklicherweise löst combine() eine Ausnahme aus, wenn Sie eine time.time oder etwas anderes als eine datetime.time .

218voto

Alex Martelli Punkte 805329

Es gibt mehrere Möglichkeiten, obwohl ich glaube, dass die von Ihnen erwähnte (und von Ihnen abgelehnte) die am besten lesbare ist.

>>> 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)

und so weiter - aber im Grunde hängen sie alle davon ab, dass man die Informationen aus der Datenbank richtig extrahiert date Objekts und dessen Rückführung in den geeigneten ctor oder die Klassenfunktion für datetime .

34 Stimmen

Sehr guter Punkt. datetime(d.year, d.month, d.day) scheint viel lesbarer zu sein als die akzeptierte Antwort datetime.combine(d, datetime.min.time()) .

3 Stimmen

@SimonTewsi: midnight = datetime.datetime.combine(d, datetime.time.min) scheint sauberer zu sein (vorgeschlagen von @ larham1 )

2 Stimmen

@J. F. Sebastian: Es ist etwas sauberer, aber ich stimme mit Wes Winham in seiner Antwort überein, dass der Leser wissen muss, was datetime.time.min darstellt. Es scheint mir jedoch, dass datetime(d.year, d.month, d.day) ist offensichtlicher (eine Datetime ohne die Zeitkomponente). Dies ist jedoch ein unwesentlicher Punkt, und die Verwendung eines Variablennamens wie "Mitternacht" macht deutlich, was das Ergebnis ist, selbst wenn der Leser nicht weiß, was datetime.time.min vertritt.

131voto

Wes Winham Punkte 1860

Die akzeptierte Antwort ist richtig, aber ich würde es vorziehen, die Verwendung von datetime.min.time() weil mir nicht klar ist, was es genau bewirkt. Wenn es für Sie offensichtlich ist, dann umso besser für Sie. Dasselbe Gefühl habe ich auch bei der timetuple Methode und die Abhängigkeit von der Bestellung.

Meines Erachtens ist dies die am besten lesbare, explizite Methode, ohne dass der Leser mit der Materie vertraut sein muss. datetime Modul-API ist:

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

Das ist meine Meinung zu "explizit ist besser als implizit".

0 Stimmen

Und ein Lob an Kyle Gibson für die ursprüngliche Idee: stackoverflow.com/users/513197/kyle-gibson

1 Stimmen

Ich schließe mich Ihrer Meinung an. All diese anderen Antworten mit timetuple und Sternchen und min.time() erfordern Nachforschungen, und die Art und Weise, wie Python mit Daten und Datumsangaben umgeht, ist ohnehin etwas umständlich, verglichen mit der Leichtigkeit, mit der Microsoft sie in VBA behandelt. In dieser Sprache kann man sie einfach in Hash-Symbole einpacken. Aber ich schweife ab.

2 Stimmen

d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day) on-liner Funktion dieser Antwort.

60voto

teepark Punkte 1725

Sie können die date.timetuple() Verfahren und Entpacker * .

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

5 Stimmen

Das ist für meine Situation sehr nützlich. Ich weiß nicht, ob es ein Datum oder eine Uhrzeit ist, die mir übergeben wird, und es ist nicht sehr pythonisch, zu prüfen, welche Klasse es ist. Diese Methode scheint sowohl für datetime- als auch für Datumsobjekte zu funktionieren.

0 Stimmen

Ich habe das früher benutzt, bevor ich entdeckt habe datetime.combine über die Antwort von @kiamlaluno. Ich denke, es ist ziemlich pythonisch, vor allem angesichts der Konstruktion einer datetime.time Objekt dürfte etwa so aussehen datetime.time(*map(int,"H:M:S".split(":"))) Jedenfalls...

0 Stimmen

Auch in vielen anderen Zusammenhängen nützlich, z. B. zum Kürzen von Sekunden, Minuten oder Stunden durch Indizierung bis hinunter zu [:3] und noch tiefer, wenn Sie mit + (n,) auffüllen, wie in : dt.datetime(*(dt.datetime.utcnow().timetuple()[:2] + (1, )))

12voto

NONONONONO Punkte 533

Können Sie auch verwenden

date = datetime.utcnow().date()
dt = datetime.fromisoformat(date.isoformat())

print(dt)

datetime.datetime(2021, 11, 15, 0, 0)

2 Stimmen

Sie können auf diese Weise sogar die Zeit als Zeichenkette hinzufügen: datetime.fromisoformat(date.isoformat() + ' 17:32')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X