Konvertieren Sie Datum in Datum / Uhrzeit in Python

632

Gibt es eine integrierte Methode zum Konvertieren von a datein a datetimein Python, z. B. zum Abrufen der datetimefür Mitternacht des angegebenen Datums? Die entgegengesetzte Konvertierung ist einfach: datetimehat eine .date()Methode.

Muss ich wirklich manuell anrufen datetime(d.year, d.month, d.day)?

EMP
quelle
118
Keine dumme Frage; Datumsobjekte sollten eine .datetime()Methode haben; Was albern ist, dass sie keine solche Methode haben.
Zags
9
@Zags: oder datetime.from_date()Konstruktor.
JFS
2
@DavidNemeskey: Lies den Kommentar von Zags, auf den mein Kommentar antwortet. Es geht darum , welche Methoden sollten bestanden haben.
JFS
2
@JFSebastian: Ich habe keine Ahnung, wie ich das verpasst habe ... und ich stimme vollkommen zu.
David Nemeskey
7
Nein, es sollte nicht sein, dass ein Datum eine Teilmenge von Datum / Uhrzeit ist (es steht sogar im Namen). Es ist eindeutig, welches Datum von einer Datumszeit stammt. Umgekehrt ist ein Datum (normalerweise) ein Block von 24 Stunden, sodass es viele Datumszeiten haben kann. Welche Datums- und Uhrzeitangabe würde von einem Datum stammen? Sie können nicht immer so 00:00, denn was ist, wenn diese Zeit nicht existiert, wie zum Beispiel die Sommerzeit übersprungen. Nicht so einfach #
dalore

Antworten:

804

Sie können verwenden datetime.combine(date, time); Für die Zeit erstellen Sie ein datetime.timeObjekt, das auf Mitternacht initialisiert wurde.

from datetime import date
from datetime import datetime

dt = datetime.combine(date.today(), datetime.min.time())
kiamlaluno
quelle
79
Vielen Dank. Kombiniert mit der Tatsache, dass time () zurückgibt (0,0), denke ich, dass dies am saubersten herauskommt:datetime.combine(d, time())
EMP
33
Achten Sie nur darauf, dass Ihr Code nicht mit time.time () verwechselt wird. Qualifizierte Namen FTW!
Dustin
8
Ja, guter Punkt. Glücklicherweise löst combin () eine Ausnahme aus, wenn Sie eine time.timeoder etwas anderes als a übergeben datetime.time.
EMP
21
Für Mitternacht gibt es eine Python-Konstante entweder um datetime.time.min (2.7.1+) oder um datetime.min.time () (ältere Python)
larham1
16
Gute Lösung, aber ich denke nicht, dass datetime.min.time () der sauberste Weg ist, um eine 00:00:00 Zeit zu erhalten. Dies liegt daran, dass zunächst der durch datetime darstellbare Mindestwert abgerufen und dann die Zeitkomponente abgerufen wird. Übrigens ist datetime.min = datetime (MINYEAR, 1, 1, tzinfo = None) und hat eine Zeit von 00:00:00. Ich denke jedoch, dass es sauberer ist, explizit eine 00:00:00-Zeit entweder über time.min oder time (0, 0, 0, 0) zu erstellen.
Florin Dumitrescu
130

Es gibt verschiedene Möglichkeiten, obwohl ich glaube, dass die, die Sie erwähnen (und nicht mögen), 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 datehängen sie alle davon ab, Informationen aus dem Objekt angemessen zu extrahieren und sie wieder in den geeigneten ctor oder die geeignete Klassenfunktion für zu pflügen datetime.

Alex Martelli
quelle
12
Sehr guter Punkt. datetime(d.year, d.month, d.day)scheint viel lesbarer als die akzeptierte Antwort datetime.combine(d, datetime.min.time()).
Simon Tewsi
2
@ SimonTewsi: midnight = datetime.datetime.combine(d, datetime.time.min)scheint sauberer (vorgeschlagen von @larham1 )
jfs
2
@JF Sebastian: Es ist etwas sauberer, aber ich stimme Wes Winham in seiner Antwort zu, dass der Leser wissen muss, was datetime.time.min darstellt. Während es mir datetime(d.year, d.month, d.day)offensichtlicher erscheint (eine Datumszeit ohne die Zeitkomponente). Es ist jedoch ein kleiner Punkt, und die Verwendung eines Variablennamens wie "Mitternacht" macht deutlich, was das Ergebnis ist, auch wenn der Leser nicht weiß, was datetime.time.mindarstellt.
Simon Tewsi
76

Die akzeptierte Antwort ist richtig, aber ich würde es vorziehen, datetime.min.time()sie nicht zu verwenden, da mir nicht klar ist, was sie genau tut. Wenn es für Sie offensichtlich ist, dann mehr Kraft für Sie. Das gleiche sehe ich auch in timetupleBezug auf die Methode und das Vertrauen in die Bestellung.

Meiner Meinung nach ist der lesbarste und expliziteste Weg, dies zu tun, ohne sich darauf zu verlassen, dass der Leser mit der datetimeModul-API sehr vertraut 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".

Wes Winham
quelle
Und ein Hut Tipp an Kyle Gibson für die ursprüngliche Idee: stackoverflow.com/users/513197/kyle-gibson
Wes Winham
Ich stimme Ihrem Gefühl zu. Alle diese anderen Antworten mit timetuple und Sternchen sowie min.time () erfordern Nachforschungen, und die Python-Methode zum Behandeln von Datums- und Datumsangaben ist ohnehin etwas umständlich im Vergleich zu der Leichtigkeit, mit der Microsoft sie in VBA verarbeitet. Es ist so einfach, sie in Hash-Symbole in dieser Sprache zu verpacken. Aber ich schweife ab.
Bobort
2
d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day)On-Liner-Funktion dieser Antwort.
Aliqandil
Dies funktioniert, aber Sie müssen möglicherweise die datetimeZeitzone kennen. In diesem Fall können Sie beispielsweise import pytzhinzufügen tzinfo=pytz.timezone('Europe/London').
Alstr
48

Sie können den date.timetuple()Operator method und entpacken *.

args = d.timetuple()[:6]
datetime.datetime(*args)
Teepark
quelle
3
Dies ist nützlich für meine Situation. Ich weiß nicht, ob es sich um ein Datum oder eine Uhrzeit handelt, an der ich übergeben werde, und es ist nicht sehr pythonisch zu überprüfen, um welche Klasse es sich handelt. Diese Methode scheint sowohl für Datums- als auch für Datumsobjekte zu funktionieren.
Gattster
Ich habe dies verwendet, bevor ich datetime.combineüber @ kiamlalunos Antwort herausgefunden habe. Ich denke, es ist ziemlich pythonisch, besonders wenn man bedenkt, dass das Konstruieren eines datetime.timeObjekts wahrscheinlich datetime.time(*map(int,"H:M:S".split(":")))sowieso so aussieht ...
Tom
1
Dies ist meine Lieblingsantwort
Nam G VU
8

Heute, im Jahr 2016, denke ich, dass pandas Timestamp die sauberste Lösung bietet:

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

Der Zeitstempel ist das Pandas-Äquivalent von Datum / Uhrzeit und in den meisten Fällen austauschbar. Prüfen:

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

Aber falls Sie wirklich eine Vanille-Datumszeit wollen, können Sie trotzdem Folgendes tun:

pd.Timestamp(d).to_datetime()

Zeitstempel sind viel leistungsfähiger als Datumszeiten, unter anderem beim Umgang mit Zeitzonen. Tatsächlich sind Zeitstempel so mächtig, dass es schade ist, dass sie so schlecht dokumentiert sind ...

Kadee
quelle
Guter Anruf. Kam hierher, als ich dachte, es würde eine Python-Datetime-Lösung für ein Pandas DatetimeIndex-Problem benötigen. Schade, dass Pandas nicht das Konzept eines DateIndex haben.
Little Bobby Tables
6
Warum benötigen wir ein Schwergewichtspaket, um die Datums- und Uhrzeitmanipulation auch 2016 durchführen zu können?!
Cowbert
Pandas dafür herauszubringen ist wie einen Hammer zu einer Ameise zu bringen
Deji S
5

Eine Möglichkeit, von Datum zu Datum / Uhrzeit zu konvertieren, die noch nicht erwähnt wurde:

from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')
Kadee
quelle
1
Es stimmt, aber das Konvertieren von Ints in Strings und Back ist wahrscheinlich teurer als das direkte Arbeiten mit Ints. Daher würde ich dieses nur für die Verarbeitung mit geringem Volumen verwenden
Egor Kraev
3

Sie können easy_date verwenden , um es einfach zu machen:

import date_converter
my_datetime = date_converter.date_to_datetime(my_date)
Raphael Amoedo
quelle
-10

Wenn Sie etwas schnelles benötigen, erhalten datetime_object.date()Sie ein Datum für ein Datum / Uhrzeit-Objekt.

Bassdread
quelle
8
die op will das Gegenteil, von gehen datezu datetime.
Tom
Aus der Frage: Die entgegengesetzte Konvertierung ist einfach: datetimehat eine .date()Methode. , kühne Betonung meiner.
Martijn Pieters
-13

Ich bin ein Neuling in Python. Aber dieser Code hat bei mir funktioniert und die angegebene Eingabe, die ich gebe, in datetime konvertiert. Hier ist der Code. Korrigiere mich, wenn ich falsch liege.

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
Napier
quelle
Das OP hat ein datetime.date()Objekt, keine Zeichenfolge .
Martijn Pieters