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.
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.
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
à 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.
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:
- datetime.date.timetuple
- du temps.mktime
- datetime.datetime.fromtimestamp
- introduction module , explique POSIX temps, 1970 époque, UTC, TZ, l'heure d'été ...
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.
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
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.