257 votes

En Python, comment convertir un objet `datetime` en secondes ?

Excusez cette question simple... Je suis nouveau en Python... J'ai cherché un peu partout et rien ne semble fonctionner.

J'ai un groupe 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)

Il semble que cela ne différencie que les dates qui ont des jours différents :

t.toordinal()

Toute aide est la bienvenue.

0 votes

2 votes

Je convertirais probablement les deux en S depuis l'époque et je partirais de là : int(t.timestamp())

0 votes

261voto

Mark Ransom Points 132545

Pour la date spéciale du 1er janvier 1970, il existe plusieurs options.

Pour toute autre date de départ, vous devez obtenir la différence entre les deux dates en secondes. En soustrayant deux dates, on obtient timedelta qui, à partir de Python 2.7, possède un objet total_seconds() fonction.

>>> (t-datetime.datetime(1970,1,1)).total_seconds()
1256083200.0

La date de départ est généralement spécifiée en UTC, donc pour obtenir des résultats corrects, il faut utiliser la méthode suivante datetime que vous nourrissez dans cette formule devrait être dans UTC aussi. Si votre datetime n'est pas déjà en UTC, vous devrez le convertir avant de l'utiliser, ou attacher un fichier tzinfo qui a le bon décalage.

Comme indiqué dans les commentaires, si vous avez une tzinfo attaché à votre datetime alors vous devez en ajouter un à la date de début, sinon la soustraction échouera ; pour l'exemple ci-dessus, j'ajouterais tzinfo=pytz.utc si vous utilisez Python 2 ou tzinfo=timezone.utc si vous utilisez Python 3.

0 votes

Je préfère cette méthode car elle ne nécessite qu'une seule importation.

0 votes

Merci pour votre aide ! (Choisi parce que c'est la solution la plus générale)

1 votes

Python me prévient maintenant : "TypeError : can't subtract offset-naive and offset-aware datetimes" Quelle est la meilleure solution pour corriger cela ?

192voto

Andrzej Points 40

À partir de Python 3.3, cela devient très facile grâce à la fonction datetime.timestamp() méthode. Bien entendu, cela 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 flottant représentant des fractions paires de seconde. Si l'objet datetime n'a pas de fuseau horaire (comme dans l'exemple ci-dessus), il sera supposé que l'objet datetime représente l'heure locale, c'est-à-dire qu'il s'agira du nombre de secondes entre l'heure actuelle à votre emplacement et le 1970-01-01 UTC.

132voto

Mark Byers Points 318575

Pour obtenir l'heure Unix (secondes depuis le 1er janvier 1970) :

>>> import datetime, time
>>> t = datetime.datetime(2011, 10, 21, 0, 0)
>>> time.mktime(t.timetuple())
1319148000.0

23 votes

Soyez prudent lorsque vous utilisez time.mktime car il exprime l'heure locale et dépend de la plate-forme.

7 votes

Faites attention en effet. Il m'a mordu le cul au plus haut point.

0 votes

Il suppose que t est une heure locale. Le décalage de l'UTC pour le fuseau horaire local peut avoir été différent dans le passé et si mktime() (bibliothèque C) n'a pas accès aux données historiques du fuseau horaire sur une plateforme 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 pour désambiguïser. par exemple, si vous savez que des valeurs de date/heure consécutives doivent augmenter dans un fichier journal

32voto

Robert Lujo Points 2743

Peut-être hors sujet : obtenir l'heure UNIX/POSIX à partir de l'heure de la date 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 les différents fuseaux horaires ont un impact sur les résultats, par exemple, mon TZ/DST actuel renvoie :

>>>  time.mktime(datetime.datetime(1970, 1, 1, 0, 0).timetuple())
-3600 # -1h

Il faut donc envisager de normaliser en UTC en utilisant des versions UTC des fonctions.

Note ce 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 :

28voto

dan3 Points 1210

int (t.strftime("%s")) fonctionne également

1 votes

Cela fonctionne pour moi dans Python 2.7, avec import datetime; t = datetime.datetime(2011, 10, 21, 0, 0) (comme spécifié par le PO). Mais vraiment, je doute que %s soit un format de temps récemment ajouté.

1 votes

@dan3 : faux. %s n'est pas supporté (il peut fonctionner sur certaines plates-formes si t 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.

0 votes

%s n'est documenté nulle part. Je l'ai semé dans du code réel et je me suis demandé ce que c'était. J'ai regardé dans la documentation et il n'y a pas de chose telle que %s . Il y a seulement un grand S pour les secondes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X