Comment convertir un objet Python datetime en secondes

toutes mes excuses pour cette simple question... Je suis nouveau en Python... J'ai cherché partout et rien ne semble fonctionner.

j'ai un tas d'objets datetime et je veux calculer le nombre de secondes depuis un moment fixe dans le passé pour chacun d'eux (par exemple depuis le 1er janvier 1970).

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

cela semble faire une différence seulement entre les dates qui ont des jours différents:

t.toordinal()

toute aide est énorme apprécier.

164
demandé sur Nathan Lippi 2011-10-21 21:09:59

8 réponses

pour la date spéciale du 1er janvier 1970 il y a plusieurs options.

pour toute autre date de début vous devez obtenir la différence entre les deux dates en secondes. La soustraction de deux dates donne un objet timedelta , qui, en 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 dans UTC, donc pour des résultats corrects le datetime que vous alimentez dans cette formule devrait être dans UTC aussi bien. Si votre datetime n'est pas déjà dans UTC, vous devrez le convertir avant de l'utiliser, ou joindre une classe tzinfo qui a l'offset approprié.

comme noté dans les commentaires, si vous avez un tzinfo attaché à votre datetime alors vous aurez besoin d'un à la date de début ainsi ou 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.

176
répondu Mark Ransom 2015-08-24 23:19:51

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
119
répondu Mark Byers 2011-10-21 17:14:09

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

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

la valeur de retour sera un flotteur représentant des fractions égales d'une seconde. Si la date est le fuseau horaire naïf (comme dans l'exemple ci-dessus), il sera présumé que l'objet datetime représente l'heure locale, c'est à dire qu'Il sera le nombre de secondes de l'heure actuelle à votre lieu à 1970-01-01 UTC.

64
répondu Andrzej Pronobis 2015-05-10 20:36:48

peut-être hors sujet: pour obtenir le temps UNIX/POSIX de datetime et le convertir en arrière:

>>> 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 des périodes différentes 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

on devrait donc envisager de normaliser à L'UTC en utilisant des versions UTC des fonctions.

Note ce résultat peut être utilisé pour calculer le décalage UTC de votre fuseau horaire actuel. Dans cet exemple est +1h, i.e. UTC+0100.

, les Références:

19
répondu Robert Lujo 2017-11-14 10:59:02

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

18
répondu dan3 2014-03-04 19:12:31

de l'python docs:

timedelta.total_seconds()

retourner 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.

noter que pour de très grands intervalles de temps (plus de 270 ans sur la plupart des plates-formes) cette méthode perdra la précision microseconde.

cette fonctionnalité est nouvelle dans la version 2.7.

11
répondu Michael 2014-01-09 22:36:44

j'ai essayé le calendrier standard de la bibliothèque .timegm et il fonctionne assez 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
répondu Shaohong Li 2015-05-09 19:13:10

pour convertir un objet datetime qui représente le temps en UTC en horodatage POSIX :

from datetime import timezone

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

pour convertir un objet datetime qui représente le temps dans le 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; une solution uniquement stdlib peut fonctionner .

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

1
répondu jfs 2017-05-23 12:03:03