Toutes mes excuses pour la simple question ... Je suis nouveau sur Python ... J'ai cherché autour et rien ne semble fonctionner.
J'ai un tas d'objets datetime et je veux calculer le nombre de secondes depuis un temps fixe dans le passé pour chacun (par exemple depuis le 1er janvier 1970).
import datetime
t = datetime.datetime(2009, 10, 21, 0, 0)
Cela semble ne faire que différencier les dates qui ont des jours différents:
t.toordinal()
Toute aide est très appréciée.
python
python-2.7
Nathan Lippi
la source
la source
datetime.date
en horodatage UTC en Pythonint(t.timestamp())
Réponses:
Pour la date spéciale du 1er janvier 1970, il existe plusieurs options.
Pour toute autre date de début, vous devez obtenir la différence entre les deux dates en quelques secondes. La soustraction de deux dates donne un
timedelta
objet qui, à partir de Python 2.7, a unetotal_seconds()
fonction.La date de début est généralement spécifiée en UTC, donc pour des résultats corrects,
datetime
vous introduisez cette formule en UTC également. Si votredatetime
n'est pas déjà en UTC, vous devrez le convertir avant de l'utiliser, ou attacher unetzinfo
classe qui a le bon décalage.Comme indiqué dans les commentaires, si vous en avez un
tzinfo
attaché,datetime
vous en aurez également besoin à la date de début ou la soustraction échouera; pour l'exemple ci-dessus, j'ajouteraistzinfo=pytz.utc
si vous utilisez Python 2 outzinfo=timezone.utc
si vous utilisez Python 3.la source
datetime.datetime(1970,1,1,tzinfo=pytz.utc)
.datetime.datetime.utcfromtimestamp(0)
j'ai utilisé cela pour obtenir facilement «l'époque». Notez que l'époque n'est pas toujours la même sur tous les systèmes.time.time()
etdatetime.now() - datetime(1970, 1, 1)
diffère de 7200 secondes. Utilisez plutôt(t - datetime.datetime.fromtimestamp(0)).total_seconds()
. Ne pas utiliserutcfromtimestamp(0)
si vous souhaitez convertir un datetime dans votre fuseau horaire local.Pour obtenir l'heure Unix (secondes depuis le 1er janvier 1970):
la source
t
s'agit d'une heure locale. Le décalage UTC pour le fuseau horaire local peut avoir été différent dans le passé et simktime()
(bibliothèque C) n'a pas accès aux données de fuseau horaire historiques sur une plate-forme donnée, il peut échouer (pytz
est un moyen portable d'accéder à la base de données tz). En outre, l'heure locale peut être ambiguë, par exemple, pendant les transitions DST - vous avez besoin d'informations supplémentaires pourtime.mktime(datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timetuple())
se traduit par une1564819506.0
baisse silencieuse des millisecondes, maisdatetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timestamp()
(réponse d'Andrzej Pronobis) entraîne1564819506.912
le résultat attendu.À partir de Python 3.3, cela devient super facile avec la
datetime.timestamp()
méthode. Bien sûr, cela ne sera utile que si vous avez besoin du nombre de secondes à partir du 1970-01-01 UTC.La valeur de retour sera un flottant représentant même des fractions de seconde. Si le datetime est naïf de fuseau horaire (comme dans l'exemple ci-dessus), il sera supposé que l'objet datetime représente l'heure locale, c'est-à-dire que ce sera le nombre de secondes de l'heure actuelle à votre emplacement jusqu'au 1970-01-01 UTC.
la source
Peut-être hors sujet: pour obtenir l'heure UNIX / POSIX à partir de datetime et la reconvertir:
Notez que différents fuseaux horaires ont un impact sur les résultats, par exemple mes retours TZ / DST actuels:
par conséquent, il convient d'envisager la normalisation UTC en utilisant 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, c'est + 1h, c'est-à-dire UTC + 0100.
Références:
la source
mktime()
peut échouer . En général, vous devezpytz
convertir l'heure locale en utc pour obtenir l'horodatage POSIX.int (t.strftime("%s"))
fonctionne aussila source
import datetime; t = datetime.datetime(2011, 10, 21, 0, 0)
(comme spécifié par OP). Mais vraiment, je doute que% s soit un format d'heure récemment ajouté.%s
n'est pas pris en charge (il peut fonctionner sur certaines plates-formes si sifft
est un objet datetime naïf représentant l'heure locale et si la bibliothèque C locale a accès à la base de données tz sinon le résultat peut être faux). Ne l'utilisez pas.%s
n'est documenté nulle part. Je l'ai semé dans du vrai code et je me demandais ce que c'est et je regarde dans la documentation et il n'y a rien de tel%s
. Il n'y a de gros S que pour les secondes.à partir des documents python:
Renvoie le nombre total de secondes contenues dans la durée. Équivalent à
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 plateformes), cette méthode perdra sa précision en microsecondes.
Cette fonctionnalité est nouvelle dans la version 2.7.
la source
Pour convertir un objet datetime qui représente l'heure en UTC en horodatage POSIX :
Pour convertir un objet datetime qui représente l'heure dans le fuseau horaire local en horodatage POSIX:
Voir Comment convertir l'heure locale en UTC en Python? Si la base de données tz est disponible sur une plateforme donnée; une solution uniquement stdlib peut fonctionner .
Suivez les liens si vous avez besoin de solutions pour les
<3.3
versions Python.la source
J'ai essayé le calendar.timegm de la bibliothèque standard et cela fonctionne assez bien:
Réf: https://docs.python.org/2/library/calendar.html#calendar.timegm
la source
aDateTime
c'est une heure UTC