web-dev-qa-db-fra.com

Python -Remove Time de la chaîne de date/heure

J'ai une chaîne de date et je veux la convertir en type de date:

J'ai essayé d'utiliser datetime.datetime.strptime avec le format que je veux mais il renvoie l'heure avec la conversion.

    when = alldates[int(daypos[0])]
    print when, type(when)

    then = datetime.datetime.strptime(when, '%Y-%m-%d')
    print then, type(then)

Voici ce que la sortie renvoie:

   2013-05-07 <type 'str'>
   2013-05-07 00:00:00 <type 'datetime.datetime'>

Je dois enlever le temps: 00:00:00.

25
pythonhunter
print then.date()

Ce que vous voulez, c'est un objet datetime.date. Ce que vous avez est un objet datetime.datetime. Vous pouvez modifier l'objet lorsque vous imprimez comme indiqué ci-dessus ou procédez comme suit lors de la création de l'objet:

then = datetime.datetime.strptime(when, '%Y-%m-%d').date()
46
Woody Pride
>>> print then.date(), type(then.date())
2013-05-07 <type 'datetime.date'>

Pour convertir une chaîne en date, AFAIK est le module dateutil le plus simple:

import dateutil.parser
datetime_object = dateutil.parser.parse("2013-05-07")

Il peut également gérer les fuseaux horaires:

print(dateutil.parser.parse("2013-05-07"))
>>> datetime.datetime(2013, 5, 7, 1, 12, 12, tzinfo=tzutc())

Si vous avez un objet datetime, dites:

import pytz
import datetime
now = datetime.datetime.now(pytz.UTC)

et vous voulez couper la partie temps, alors je pense qu’il est plus facile de construire un nouvel objet au lieu de "soustraire la partie temps". Il est plus court et plus résistant aux balles:

date_part datetime.datetime(now.year, now.month, now.day, tzinfo=now.tzinfo)

Il conserve également les informations de fuseau horaire, il est plus facile à lire et à comprendre qu’une soustraction sous timedelta, et vous avez également la possibilité de donner un fuseau horaire différent dans la même étape (ce qui est logique, car vous n’auriez de toute façon pas de temps) .

1
nagylzs

Pour moi, je devais GARDER un objet horodaté, car j’utilisais le temps universel coordonné (UTC) et c’est un peu pénible. Donc, voici ce que j'ai fini par faire:

date = datetime.datetime.utcnow()

start_of_day = date - datetime.timedelta(
    hours=date.hour, 
    minutes=date.minute, 
    seconds=date.second, 
    microseconds=date.microsecond
)

end_of_day = start_of_day + datetime.timedelta(
    hours=23, 
    minutes=59, 
    seconds=59
)

Exemple de sortie:

>>> date
datetime.datetime(2016, 10, 14, 17, 21, 5, 511600)
>>> start_of_day
datetime.datetime(2016, 10, 14, 0, 0)
>>> end_of_day
datetime.datetime(2016, 10, 14, 23, 59, 59)
0
Dovy

Les objets datetime ont une méthode replace(). Cela préserve le fuseau horaire, vous pouvez donc faire

>>> from Django.utils import timezone
>>> now = timezone.now()
>>> now
datetime.datetime(2018, 8, 30, 14, 15, 43, 726252, tzinfo=<UTC>)
>>> now.replace(hour=0, minute=0, second=0, microsecond=0)
datetime.datetime(2018, 8, 30, 0, 0, tzinfo=<UTC>)
0
ukrutt