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.
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.
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 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.
int (t.strftime("%s"))
fonctionne aussi
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:
à 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.
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.
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