web-dev-qa-db-fra.com

En Python, comment convertir un objet `datetime` en secondes?

Toutes mes excuses pour la question simple ... Je suis un nouveau venu dans Python ... J'ai fait des recherches et rien ne semble fonctionner.

J'ai un tas d'objets datetime et je veux calculer le nombre de secondes écoulées depuis un temps fixe dans le passé (par exemple depuis le 1er janvier 1970).

import datetime
t = datetime.datetime(2009, 10, 21, 0, 0)

Cela semble ne faire que distinguer les dates qui ont des jours différents:

t.toordinal()

Toute aide est très appréciée.

201
Nathan Lippi

Pour la date spéciale du 1er janvier 1970, les options sont multiples.

Pour toute autre date de départ, vous devez connaître la différence entre les deux dates en secondes. La soustraction de deux dates donne un objet timedelta qui, à compter de Python 2.7, a une fonction total_seconds().

>>> (t-datetime.datetime(1970,1,1)).total_seconds()
1256083200.0

La date de début est généralement spécifiée en UTC. Par conséquent, pour que les résultats soient corrects, la datetime que vous introduisez dans cette formule doit également être en UTC. Si votre datetime n'est pas déjà au format UTC, vous devrez le convertir avant de l'utiliser ou attacher une classe tzinfo avec le décalage approprié.

Comme indiqué dans les commentaires, si vous avez une tzinfo attachée à votre datetime, vous en aurez également besoin de la date de début, sinon la soustraction échouera; pour l'exemple ci-dessus, je voudrais ajouter tzinfo=pytz.utc si vous utilisez Python 2 ou tzinfo=timezone.utc si vous utilisez Python 3.

210
Mark Ransom

Pour obtenir le temps Unix (secondes depuis le 1er janvier 1970):

>>> import datetime, time
>>> t = datetime.datetime(2011, 10, 21, 0, 0)
>>> time.mktime(t.timetuple())
1319148000.0
126
Mark Byers

À partir de Python 3.3, cela devient super facile avec la méthode datetime.timestamp(). Ceci ne sera bien sûr utile que si vous avez besoin du nombre de secondes à partir du 1970-01-01 UTC.

from datetime import datetime
dt = datetime.today()  # Get timezone naive now
seconds = dt.timestamp()

La valeur de retour sera un float représentant des fractions de seconde paires. Si la date et l'heure sont naïves dans le fuseau horaire (comme dans l'exemple ci-dessus), on suppose que l'objet datetime représente l'heure locale, c.-à-d. Qu'il s'agira du nombre de secondes entre l'heure actuelle de votre emplacement et le 1970-01-01 UTC.

92
Andrzej Pronobis

int (t.strftime("%s")) fonctionne aussi

25
dan3

Peut-être hors sujet: pour obtenir l'heure UNIX/POSIX à partir de datetime et la reconvertir:

>>> import datetime, time
>>> dt = datetime.datetime(2011, 10, 21, 0, 0)
>>> s = time.mktime(dt.timetuple())
>>> s
1319148000.0

# and back
>>> datetime.datetime.fromtimestamp(s)
datetime.datetime(2011, 10, 21, 0, 0)

Notez que différents fuseaux horaires ont un impact sur les résultats, par exemple. mes déclarations TZ/DST actuelles:

>>>  time.mktime(datetime.datetime(1970, 1, 1, 0, 0).timetuple())
-3600 # -1h

par conséquent, il convient d’envisager une normalisation en UTC à l’aide des versions UTC des fonctions.

Notez que le résultat précédent peut être utilisé pour calculer le décalage UTC de votre fuseau horaire actuel. Dans cet exemple, il s'agit de + 1h, c'est-à-dire UTC + 0100.

Références:

22
Robert Lujo

à partir de la docs python:

timedelta.total_seconds()

Renvoie le nombre total de secondes contenues dans la durée. Équivalent à

(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6

calculé avec la vraie division activée.

Notez que pour des intervalles de temps très longs (supérieurs à 270 ans sur la plupart des plates-formes), cette méthode perdra en précision en microsecondes.

Cette fonctionnalité est nouvelle dans la version 2.7.

12
Michael

Pour convertir un objet datetime qui représente l'heure UTC en horodatage POSIX :

from datetime import timezone

seconds_since_Epoch = utc_time.replace(tzinfo=timezone.utc).timestamp()

Pour convertir un objet datetime représentant l'heure du fuseau horaire local en horodatage POSIX:

import tzlocal # $ pip install tzlocal

local_timezone = tzlocal.get_localzone()
seconds_since_Epoch = local_timezone.localize(local_time, is_dst=None).timestamp()

Voir Comment convertir l'heure locale en UTC en Python? Si la base de données tz est disponible sur une plate-forme donnée; ne solution stdlib-only peut fonctionner .

Suivez les liens si vous avez besoin de solutions pour les versions de <3.3 Python.

2
jfs

J'ai essayé la bibliothèque standard calendar.timegm et cela fonctionne très bien:

# convert a datetime to milliseconds since Epoch
def datetime_to_utc_milliseconds(aDateTime):
    return int(calendar.timegm(aDateTime.timetuple())*1000)

Réf.: https://docs.python.org/2/library/calendar.html#calendar.timegm

1
Shaohong Li