908 votes

Convertir une date en datetime en Python

Existe-t-il une méthode intégrée pour convertir un date à un datetime en Python, par exemple pour obtenir le datetime pour le minuit de la date donnée ? La conversion inverse est facile : datetime a un .date() méthode.

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

196 votes

Ce n'est pas une question stupide ; les objets de date devraient avoir un .datetime() Ce qui est stupide, c'est qu'ils n'ont pas une telle méthode.

22 votes

@Zags : ou datetime.from_date() constructeur.

1 votes

@J.F.Sebastian : sauf qu'une telle méthode n'existe pas.

1142voto

kiamlaluno Points 11856

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

from datetime import date
from datetime import datetime

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

104 votes

Merci. Combiné avec le fait que time() renvoie (0,0), je pense que c'est le résultat le plus propre : datetime.combine(d, time())

42 votes

Faites juste attention à ce que votre code ne confonde pas datetime.time() avec time.time(). Noms qualifiés FTW !

9 votes

Oui, bonne remarque. Heureusement, combine() lève une exception si vous passez dans un fichier time.time ou toute autre chose qu'un datetime.time .

190voto

Alex Martelli Points 330805

Il existe plusieurs façons de procéder, même si 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 en fait, ils s'articulent tous autour de l'extraction appropriée d'infos du date et de le réinjecter dans le ctor ou la fonction de classe approprié pour datetime .

27 votes

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

3 votes

@SimonTewsi : midnight = datetime.datetime.combine(d, datetime.time.min) semble plus propre (suggéré par @ larham1 )

2 votes

@J. F. Sebastian : C'est un peu plus propre mais je suis d'accord avec la réponse de Wes Winham selon laquelle 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) est plus évident (une date sans la composante temporelle). C'est un point mineur, cependant, et l'utilisation d'un nom de variable comme "midnight" rend le résultat évident, même si le lecteur ne sait pas ce que "midnight" veut dire. datetime.time.min représente.

119voto

Wes Winham Points 570

La réponse acceptée est correcte, mais je préférerais éviter d'utiliser datetime.min.time() parce que ce n'est pas évident pour moi de savoir ce qu'il fait exactement. Si c'est évident pour vous, je vous félicite. Je ressens également la même chose à propos du timetuple et la dépendance à l'égard de la commande.

À mon avis, la façon la plus lisible et la plus explicite de le faire, sans que le lecteur ait à connaître le système de gestion de l'information de l'entreprise, est de le faire. datetime module API 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 "l'explicite est meilleur que l'implicite".

0 votes

Et un coup de chapeau à Kyle Gibson pour l'idée originale : stackoverflow.com/users/513197/kyle-gibson

1 votes

Je suis d'accord avec votre sentiment. Toutes ces autres réponses avec timetuple et astérisques et min.time() demandent de la recherche, et la façon Python de gérer les dates et les dates-temps est un peu lourde de toute façon par rapport à la facilité avec laquelle Microsoft les gère dans VBA. Dans ce langage, il suffit de les envelopper dans des symboles de hachage. Mais je m'égare.

2 votes

d2dt = lambda date: datetime(year=date.year, month=date.month, day=date.day) fonction on-liner de cette réponse.

59voto

teepark Points 954

Vous pouvez utiliser le date.timetuple() méthode et opérateur de déballage * .

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

5 votes

C'est utile dans ma situation. Je ne sais pas si c'est une date ou une datetime que l'on me passe, et ce n'est pas très pythique de vérifier de quelle classe il s'agit. Cette méthode semble fonctionner à la fois pour les objets datetime et date.

0 votes

Je l'utilisais avant de découvrir datetime.combine via la réponse de @kiamlaluno. Je pense que c'est assez pythonique, surtout si l'on considère que la construction d'une datetime.time est susceptible de ressembler à quelque chose comme datetime.time(*map(int,"H:M:S".split(":"))) de toute façon...

1 votes

C'est ma réponse préférée

-11voto

Bassdread Points 330

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

8 votes

L'op veut le contraire, passer de date à datetime .

0 votes

De la question : Le site conversion inverse est facile : datetime a un .date() méthode. C'est moi qui souligne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X