305 votes

Comment tronquer l'heure sur un objet datetime ?

Quelle est la façon la plus élégante de tronquer un fichier python ? datetime objet ?

Dans ce cas particulier, au jour près. Donc, en gros, on met l'heure, la minute, les secondes et les microsecondes à 0.

Je voudrais que la sortie soit également un datetime et non une chaîne de caractères.

468voto

Chris W. Points 7182

Je pense que c'est ce que vous cherchez...

>>> import datetime
>>> dt = datetime.datetime.now()
>>> dt = dt.replace(hour=0, minute=0, second=0, microsecond=0) # Returns a copy
>>> dt
datetime.datetime(2011, 3, 29, 0, 0)

Mais si vous ne vous souciez vraiment pas de l'aspect temporel des choses, alors vous devriez seulement faire circuler les informations suivantes date des objets...

>>> d_truncated = datetime.date(dt.year, dt.month, dt.day)
>>> d_truncated
datetime.date(2011, 3, 29)

20 votes

Avec un dt conscient du fuseau horaire, datetime.datetime(dt.year, dt.month, dt.day) supprime les informations tzinfo.

2 votes

Si vous ne cherchez qu'aujourd'hui, vous pouvez également utiliser datetime.date.today().

7 votes

Notez que python 2 et python 3 docs indiquent tous deux que le replace() méthode renvoie à un objet datetime, donc l'incantation correcte serait : dt = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)

87voto

Jochen Ritzel Points 42916

Utilisez un date pas un datetime si vous ne vous souciez pas de l'heure.

>>> now = datetime.now()
>>> now.date()
datetime.date(2011, 3, 29)

Vous pouvez mettre à jour une date comme ceci :

>>> now.replace(minute=0, hour=0, second=0, microsecond=0)
datetime.datetime(2011, 3, 29, 0, 0)

13 votes

Avec des dates tenant compte du fuseau horaire, now.date() rejette les informations du tzinfo.

1 votes

1 votes

Notez que c'est une sorte de douleur pour le reconvertir en date mais

23voto

ʇsәɹoɈ Points 8284

Vous ne pouvez pas tronquer un objet datetime car il est immuable .

Cependant, voici une façon de construire une nouvelle date avec les champs 0 heure, minute, seconde et microseconde, sans jeter la date originale ou le tzinfo :

newdatetime = now.replace(hour=0, minute=0, second=0, microsecond=0)

1 votes

+1 : si vous mettez le replace d'abord, puisque c'est probablement ce qu'ils veulent.

0 votes

Il est incorrect d'utiliser tzinfo=now.tzinfo . Le site tzinfo à minuit peut être différent, par exemple, le décalage utc à 2012-04-01 00:09:00 (9 heures) dans le fuseau horaire Australie/Melbourne est de AEST+10:00 mais c'est AEDT+11:00 sur 2012-04-01 00:00:00 (minuit) - il y a une transition vers la fin de l'heure d'été ce jour-là. Vous pouvez utiliser pytz module pour le réparer, voir ma réponse.

4voto

Sandro Munda Points 12808

Vous pouvez utiliser datetime.strftime pour extraire le jour, le mois, l'année...

Exemple :

from datetime import datetime
d = datetime.today()

# Retrieves the day and the year
print d.strftime("%d-%Y")

Sortie (pour aujourd'hui) :

29-2011

Si vous voulez juste récupérer le jour, vous pouvez utiliser l'attribut day comme :

from datetime import datetime
d = datetime.today()

# Retrieves the day
print d.day

Ouput (pour aujourd'hui) :

29

0 votes

Le problème, c'est que je l'ai déjà fait une fois, donc cela pourrait avoir plus d'impact que de simplement définir les champs heure, minutes, etc. dans l'objet datetime.

0 votes

Heh, c'est une façon bizarre de le faire, vous pouvez en fait juste faire d.day etc.

1voto

kyrre Points 122

Il existe un module datetime_truncate qui gère cela pour vous. Il appelle simplement datetime.replace.

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