En Python, comment voulez-vous convertir un `datetime` objet de secondes?
Excuses pour cette question simple... je suis nouveau sur 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 ne semble être que la différenciation entre les dates qui ont des jours différents:
t.toordinal()
Toute aide est très appréciée.
- connexes: la Conversion de
datetime.date
à l'UTC timestamp en Python - Je serais probablement convertir à la fois pour S depuis l'époque et à partir de là:
int(t.timestamp())
- pour l'opération inverse, rendez-vous ici: convert-seconds-since-epoch-to-a-datetime-object
Vous devez vous connecter pour publier un commentaire.
Pour la date du 1er janvier 1970, il existe plusieurs options.
Pour toute autre date de démarrage vous avez besoin pour obtenir la différence entre les deux dates en quelques secondes. Soustraction de deux dates donne un
timedelta
objet, qui, comme de Python 2.7 a untotal_seconds()
fonction.La date de départ est généralement spécifiée en UTC, donc, pour obtenir de bons résultats de la
datetime
vous alimenter cette formule doit être au format UTC ainsi. Si votredatetime
n'est pas en UTC déjà, vous devrez le convertir avant de l'utiliser, ou d'attacher unetzinfo
classe qui a le bon décalage.Comme indiqué dans les commentaires, si vous avez un
tzinfo
attaché à votredatetime
ensuite, vous aurez besoin de l'un sur la date de départ ou la soustraction échoue; pour l'exemple ci-dessus, je voudrais ajoutertzinfo=pytz.utc
si à l'aide de Python 2 outzinfo=timezone.utc
si à l'aide de Python 3.datetime.datetime(1970,1,1,tzinfo=pytz.utc)
.datetime.datetime.utcfromtimestamp(0)
j'ai utilisé cela pour obtenir le 'époque' facilement. Notez que l'époque n'est pas toujours le même sur tous les systèmes.time.time()
etdatetime.now() - datetime(1970, 1, 1)
diffèrent par 7200 secondes. Utilisez plutôt(t - datetime.datetime.fromtimestamp(0)).total_seconds()
. Ne pas utiliserutcfromtimestamp(0)
si vous voulez convertir un datetime dans votre fuseau horaire local.t
est l'heure UTC.t
doit être au format utc pour la formule à faire sens.Pour obtenir le temps Unix (nombre de secondes depuis le 1er janvier 1970):
t
est une, heure locale. Décalage UTC pour le fuseau horaire local peuvent avoir été différentes dans le passé et simktime()
(bibliothèque C) n'a pas accès à un historique de données de fuseau horaire sur une plate-forme donnée qu'il peut échouer (pytz
est un portable moyen pour accéder à la base de données tz). Aussi, l'heure locale peut être ambiguë par exemple, au cours de l'heure d'été transitions -- vous avez besoin d'informations supplémentaires pour lever l'ambiguïté par exemple, si vous savez qu'consécutives valeurs de date/heure devrait être à la hausse dans un fichier de logÀ partir de Python 3.3, cela devient super facile avec le
datetime.timestamp()
méthode. Bien sûr, cela ne sera utile que si vous avez besoin le nombre de secondes depuis l'UTC 1970-01-01.La valeur de retour sera un flotteur représentant même une fraction de 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 emplacement pour UTC 1970-01-01.
int (t.strftime("%s"))
travaille aussiimport datetime; t = datetime.datetime(2011, 10, 21, 0, 0)
(comme spécifié par l'OP). Mais vraiment, je doute que %s a été récemment ajoutée format de l'heure.%s
n'est pas pris en charge (il peut fonctionner sur certaines plates-formes ifft
est un naïf objet datetime représentant, heure locale, et si les locaux de la bibliothèque C a accès à la base de données tz sinon le résultat peut être faux). Ne l'utilisez pas.%s
n'est pas documentée, n'importe où. Je la semer dans le code réel, et je me demandais qu'est-ce que ce et de regarder dans la documentation et il n'y a pas une telle chose comme%s
. Il y est seulement avec un grand S seulement pour les secondes.Peut-être hors-la-sujet: pour obtenir UNIX/POSIX temps de datetime et de le convertir en arrière:
Noter que les différents fuseaux horaires, et ont un impact sur les résultats, par exemple, mon TZ/DST retourne:
donc on devrait envisager la normalisation de l'UTC en utilisant UTC versions des fonctions.
Note que le résultat précédent peut être utilisé pour calculer le décalage UTC de votre fuseau horaire actuel. Dans cet exemple, est de +1h, c'est à dire UTC+0100.
Références:
mktime()
peut échouer. En général, vous devezpytz
pour convertir l'heure locale à l'utc, pour obtenir POSIX timestamp.de l'python docs:
Retourner le nombre total de secondes contenues dans la durée. Équivalent à
calculée avec la vraie division activé.
Noter que pour de très grands intervalles de temps (plus de 270 ans sur la plupart des plates-formes), cette méthode va perdre de la microseconde précision.
C'est une nouvelle fonctionnalité dans la version 2.7.
Pour convertir un objet datetime qui représente l'heure UTC à POSIX timestamp:
Pour convertir un objet datetime représente l'heure dans le fuseau horaire local à POSIX timestamp:
Voir Comment puis-je convertir, heure locale, à l'UTC en Python? Si la tz de la base de données est disponible sur une plate-forme donnée; un stdlib seule solution peut fonctionner.
De suivre les liens si vous avez besoin de solutions pour
<3.3
les versions de Python.J'ai essayé de la bibliothèque standard du calendrier.timegm et il fonctionne très bien:
Ref: https://docs.python.org/2/library/calendar.html#calendar.timegm
aDateTime
est un temps UTC