Convertir la date en datetime en Python

632

Existe-t-il une méthode intégrée pour convertir un dateen a datetimeen Python, par exemple en obtenant le datetimepour minuit de la date donnée? La conversion opposée est facile: datetimea une .date()méthode.

Dois-je vraiment appeler manuellement datetime(d.year, d.month, d.day)?

EMP
la source
118
Pas une question idiote; les objets de date doivent avoir une .datetime()méthode; ce qui est stupide, c'est qu'ils n'ont pas une telle méthode.
Zags
9
@Zags: ou datetime.from_date()constructeur.
jfs
2
@DavidNemeskey: lisez le commentaire de Zags auquel mon commentaire répond. Il s'agit de savoir quelles méthodes auraient dû exister.
jfs
2
@JFSebastian: Je ne sais pas comment j'ai raté ça ... et je suis complètement d'accord.
David Nemeskey
7
non, il ne devrait pas une date est un sous-ensemble de datetime (c'est même dans le nom). Il est sans ambiguïté quelle est la date d'un datetime. Mais dans l'autre sens, une date est un bloc de 24h (généralement), elle peut donc avoir plusieurs heures. Quel datetime proviendrait d'une date? Vous ne pouvez pas toujours le faire à 00h00, car si cette heure n’existe pas, comme par exemple l’heure d’été, elle est ignorée. Pas si facile #
dalore

Réponses:

805

Vous pouvez utiliser datetime.combine(date, time); pour le moment, vous créez un datetime.timeobjet initialisé à minuit.

from datetime import date
from datetime import datetime

dt = datetime.combine(date.today(), datetime.min.time())
kiamlaluno
la source
79
Merci. Combiné avec le fait que time () retourne (0,0) je pense que cela sort le plus propre:datetime.combine(d, time())
EMP
33
Faites juste attention à ne pas confondre datetime.time () avec time.time (). Noms qualifiés FTW!
Dustin
8
Oui, bon point. Heureusement, combine () lève une exception si vous passez un time.timeou autre chose qu'un a datetime.time.
EMP
21
Pour minuit, il existe une constante python à datetime.time.min (2.7.1+) ou datetime.min.time () (ancien python)
larham1
16
Bonne solution, mais je ne pense pas que datetime.min.time () soit le moyen le plus propre d'obtenir une heure 00:00:00. En effet, ce qu'il fait, c'est d'abord récupérer la valeur minimale représentable par datetime, puis obtenir sa composante temporelle. Par ailleurs, datetime.min = datetime (MINYEAR, 1, 1, tzinfo = None) et a une heure de 00:00:00. Cependant, je pense qu'il est plus propre de créer explicitement une heure 00:00:00 via time.min ou time (0, 0, 0, 0).
Florin Dumitrescu
130

Il y a plusieurs façons, bien que je pense que celle que vous mentionnez (et que vous n'aimez pas) est la plus lisible.

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

et ainsi de suite - mais fondamentalement, ils reposent tous sur l'extraction appropriée des informations de l' dateobjet et leur réintroduction dans le ctor ou la fonction de classe appropriée pour datetime.

Alex Martelli
la source
12
Très bon point. datetime(d.year, d.month, d.day)semble beaucoup plus lisible que la réponse acceptée datetime.combine(d, datetime.min.time()).
Simon Tewsi
2
@SimonTewsi: midnight = datetime.datetime.combine(d, datetime.time.min)semble plus propre (suggéré par @larham1 )
jfs
2
@JF Sebastian: C'est un peu plus propre, mais je suis d'accord avec Wes Winham dans sa réponse qu'il faut que le lecteur sache ce que représente datetime.time.min. Alors qu'il me semble que datetime(d.year, d.month, d.day)c'est plus évident (un datetime sans la composante time). C'est un point mineur, cependant, et l'utilisation d'un nom de variable comme "minuit" rend évident le résultat même si le lecteur ne sait pas ce que cela datetime.time.minreprésente.
Simon Tewsi
76

La réponse acceptée est correcte, mais je préférerais éviter d'utiliser datetime.min.time()car ce n'est pas évident pour moi exactement ce qu'elle fait. Si c'est évident pour vous, alors plus de pouvoir pour vous. Je ressens également la même chose à propos de la timetupleméthode et de la confiance dans la commande.

À mon avis, la façon la plus lisible et explicite de le faire sans compter sur le lecteur pour être très familier avec l' datetimeAPI du module est:

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

C'est mon point de vue sur "explicite vaut mieux qu'implicite".

Wes Winham
la source
Et un chapeau à Kyle Gibson pour l'idée originale: stackoverflow.com/users/513197/kyle-gibson
Wes Winham
Je suis d'accord avec ton sentiment. Toutes ces autres réponses avec horaires et astérisques et min.time () nécessitent des recherches, et la façon Python de gérer les dates et les heures est un peu lourde de toute façon par rapport à la facilité avec laquelle Microsoft les gère dans VBA. C'est aussi simple que de les envelopper dans des symboles de hachage dans cette langue. Mais je m'égare.
Bobort
2
d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day)fonction on-liner de cette réponse.
aliqandil
Cela fonctionne, mais vous devrez peut- datetimeêtre connaître le fuseau horaire. Dans ce cas, vous pouvez import pytzpuis ajouter tzinfo=pytz.timezone('Europe/London'), par exemple.
ALSTR
48

Vous pouvez utiliser la date.timetuple()méthode et décompresser l'opérateur *.

args = d.timetuple()[:6]
datetime.datetime(*args)
teepark
la source
3
C'est utile pour ma situation. Je ne sais pas si c'est une date ou un datetime que je suis passé, et ce n'est pas très pythonique pour vérifier de quelle classe il s'agit. Cette méthode semble fonctionner pour les objets datetime et date.
Gattster
J'avais l'habitude d'utiliser cela avant de découvrir datetime.combinevia la réponse de @ kiamlaluno. Je pense que c'est assez pythonique, d'autant plus que la construction d'un datetime.timeobjet est susceptible de ressembler à de datetime.time(*map(int,"H:M:S".split(":")))toute façon ...
Tom
1
Ceci est ma réponse préférée
Nam G VU
8

Aujourd'hui étant 2016, je pense que la solution la plus propre est fournie par pandas Timestamp:

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

L'horodatage est l'équivalent pandas du datetime et est interchangeable avec lui dans la plupart des cas. Vérifier:

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

Mais si vous voulez vraiment un datetime vanilla, vous pouvez toujours faire:

pd.Timestamp(d).to_datetime()

Les horodatages sont beaucoup plus puissants que les datetimes, entre autres lorsqu'ils traitent des fuseaux horaires. En fait, les horodatages sont si puissants qu'il est dommage qu'ils soient si mal documentés ...

kadee
la source
Bon appel. Je suis venu ici car je pensais qu'il aurait besoin d'une solution datetime python pour un problème DatetimeIndex pandas. Les pandas honteux n'ont pas le concept d'un DateIndex.
Little Bobby Tables
6
pourquoi avons-nous besoin d'un package lourd juste pour faire de la manipulation datetime, même en 2016?!
cowbert
Faire sortir des pandas pour cela, c'est comme prendre un marteau chez une fourmi
Deji S
5

Une façon de convertir la date en datetime qui n'a pas encore été mentionnée:

from datetime import date, datetime
d = date.today()
datetime.strptime(d.strftime('%Y%m%d'), '%Y%m%d')
kadee
la source
1
Certes, mais la conversion des ints en chaînes et en arrière est probablement plus coûteuse que de travailler directement avec des ints, donc je n'utiliserais celui-ci que pour le traitement à faible volume
Egor Kraev
3

Vous pouvez utiliser easy_date pour simplifier:

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

Si vous avez besoin de quelque chose de rapide, datetime_object.date()vous donne la date d'un objet datetime.

Bassdread
la source
8
l'op veut l'inverse, aller de dateà datetime.
Tom
De la question: La conversion opposée est facile: datetimea une .date()méthode. , gras accent.
Martijn Pieters
-13

Je suis un débutant en Python. Mais ce code a fonctionné pour moi qui convertit l'entrée spécifiée que je fournis en datetime. Voici le code. Corrige moi si je me trompe.

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
la source
L'OP a un datetime.date()objet, pas une chaîne .
Martijn Pieters