Conversion d'une chaîne d'horodatage Unix en date lisible


826

J'ai une chaîne représentant un horodatage Unix (c'est-à-dire "1284101485") en Python, et je voudrais le convertir en une date lisible. Lorsque j'utilise time.strftime, j'obtiens TypeError:

>>>import time
>>>print time.strftime("%B %d %Y", "1284101485")

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument must be 9-item sequence, not str

1
lien à la question de reconvertir aussi: stackoverflow.com/q/19801727/3273031
neige fondante

Réponses:


1210

Utiliser le datetimemodule:

from datetime import datetime
ts = int("1284101485")

# if you encounter a "year is out of range" error the timestamp
# may be in milliseconds, try `ts /= 1000` in that case
print(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))

131
.fromtimestamp()peut échouer pour les dates passées si un fuseau horaire local avait un décalage utc différent. Vous avez besoin d'une base de données de fuseau horaire historique telle que fournie par le pytzmodule (ou votre système d'exploitation). Ou tout simplement travailler en UTC et utiliser .utcfromtimestamp().
jfs

9
@JFSebastian Vous avez mentionné que cela pourrait échouer dans quelques commentaires - pourriez-vous expliquer pourquoi cela échouerait pour des dates / heures passées? (À en juger par les votes positifs, beaucoup de gens sont tous les deux d'accord avec vous et voient cela comme simple.) N'importe quel horodatage Unix a-t-il une date / heure équivalente simple?
davidhood2

3
@ davidhood2 prenez un système où python n'a pas accès à la base de données tz (Windows), définissez votre fuseau horaire local sur un fuseau horaire qui avait un décalage UTC différent dans le passé (par exemple Europe / Moscou), appelez fromtimestamp () avec des horodatages du passé (2011-). Comparez les résultats avec les valeurs calculées à l'aide de pytz. Si ce n'est pas clair; poser une question de débordement de pile distincte.
jfs

3
jfs

6
Un point d'importation est que cela prend un horodatage en secondes depuis l'époque; si vous avez des millisecondes, vous devez diviser par 1000 comme je viens de le découvrir.
wordsforhewise


145

La réponse la plus votée suggère d'utiliser fromtimestamp qui est sujet aux erreurs car il utilise le fuseau horaire local. Pour éviter les problèmes, une meilleure approche consiste à utiliser UTC:

datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')

Où posix_time est le temps de l'époque Posix que vous souhaitez convertir


2
import datetime, pytz datetime.datetime (1990, 1, 1, tzinfo = pytz.utc)
y.selivonchyk

76
>>> import time
>>> time.ctime(int("1284101485"))
'Fri Sep 10 16:51:25 2010'
>>> time.strftime("%D %H:%M", time.localtime(int("1284101485")))
'09/10/10 16:51'

10
time.ctime()et time.localtime()pourrait échouer pour les dates passées si un fuseau horaire local avait un décalage utc différent. Vous avez besoin d'une base de données de fuseau horaire historique telle que fournie par le pytzmodule (ou votre système d'exploitation). Ou tout simplement travailler en UTC et utiliser time.gmtime(). datetimepourrait fournir une plage de dates plus large et datetime.utcfromtimestamp()pourrait donc être utilisé à la place des timefonctions.
jfs

66

Il se compose de deux parties:

  1. Convertir l'horodatage Unix ("secondes depuis l'époque") en heure locale
  2. Affichez l'heure locale au format souhaité.

Un moyen portable d'obtenir l'heure locale qui fonctionne même si le fuseau horaire local avait un décalage utc différent dans le passé et que python n'a pas accès à la base de données tz consiste à utiliser un pytzfuseau horaire:

#!/usr/bin/env python
from datetime import datetime
import tzlocal  # $ pip install tzlocal

unix_timestamp = float("1284101485")
local_timezone = tzlocal.get_localzone() # get pytz timezone
local_time = datetime.fromtimestamp(unix_timestamp, local_timezone)

Pour l'afficher, vous pouvez utiliser n'importe quel format d'heure pris en charge par votre système, par exemple:

print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))
print(local_time.strftime("%B %d %Y"))  # print date in your format

Si vous n'avez pas besoin d'une heure locale, pour obtenir une heure UTC lisible à la place:

utc_time = datetime.utcfromtimestamp(unix_timestamp)
print(utc_time.strftime("%Y-%m-%d %H:%M:%S.%f+00:00 (UTC)"))

Si vous ne vous souciez pas des problèmes de fuseau horaire qui pourraient affecter la date de retour ou si python a accès à la base de données tz sur votre système:

local_time = datetime.fromtimestamp(unix_timestamp)
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f"))

Sur Python 3, vous pouvez obtenir un datetime sensible au fuseau horaire en utilisant uniquement stdlib (le décalage UTC peut être incorrect si python n'a pas accès à la base de données tz sur votre système, par exemple, sur Windows):

#!/usr/bin/env python3
from datetime import datetime, timezone

utc_time = datetime.fromtimestamp(unix_timestamp, timezone.utc)
local_time = utc_time.astimezone()
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))

Les fonctions du timemodule sont des enveloppes minces autour de l'API C correspondante et par conséquent, elles peuvent être moins portables que les datetimeméthodes correspondantes , sinon vous pouvez également les utiliser:

#!/usr/bin/env python
import time

unix_timestamp  = int("1284101485")
utc_time = time.gmtime(unix_timestamp)
local_time = time.localtime(unix_timestamp)
print(time.strftime("%Y-%m-%d %H:%M:%S", local_time)) 
print(time.strftime("%Y-%m-%d %H:%M:%S+00:00 (UTC)", utc_time))  

Ce devrait être la réponse la plus votée si vous vous souciez de l'heure locale.
azzamsa

36

Pour un horodatage lisible par l'homme à partir d'un horodatage UNIX, je l'ai déjà utilisé dans des scripts:

import os, datetime

datetime.datetime.fromtimestamp(float(os.path.getmtime("FILE"))).strftime("%B %d, %Y")

Production:

'26 décembre 2012'


25

Vous pouvez convertir l'heure actuelle comme ceci

t=datetime.fromtimestamp(time.time())
t.strftime('%Y-%m-%d')
'2012-03-07'

Pour convertir une date en chaîne dans différents formats.

import datetime,time

def createDateObject(str_date,strFormat="%Y-%m-%d"):    
    timeStamp = time.mktime(time.strptime(str_date,strFormat))
    return datetime.datetime.fromtimestamp(timeStamp)

def FormatDate(objectDate,strFormat="%Y-%m-%d"):
    return objectDate.strftime(strFormat)

Usage
=====
o=createDateObject('2013-03-03')
print FormatDate(o,'%d-%m-%Y')

Output 03-03-2013

24

Outre l'utilisation du package time / datetime , les pandas peuvent également être utilisés pour résoudre le même problème.Voici comment nous pouvons utiliser les pandas pour convertir l' horodatage en date lisible :

Les horodatages peuvent avoir deux formats:

  1. 13 chiffres (millisecondes) - Pour convertir les millisecondes à ce jour, utilisez:

    import pandas
    result_ms=pandas.to_datetime('1493530261000',unit='ms')
    str(result_ms)
    
    Output: '2017-04-30 05:31:01'
  2. 10 chiffres (secondes) - Pour convertir les secondes en date, utilisez:

    import pandas
    result_s=pandas.to_datetime('1493530261',unit='s')
    str(result_s)
    
    Output: '2017-04-30 05:31:01'

Une autre victoire pour les pandas semble-t-il - le module est fantastique en tout
Vaidøtas Ivøška

21
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')

Obtenez la date lisible de l'horodatage avec l'heure également, vous pouvez également changer le format de la date.


5
Qu'est-ce que cette réponse ajoute à cette réponse?
kocica

1
Veuillez ajouter un avertissement lié au problème d'hypothèse de fuseau horaire local. Les meilleures pratiques de programmation consistent à stocker les horodatages sous forme d'heures UTC au lieu d'horodateurs locaux. Mais cet exemple ci-dessus renverra la mauvaise heure si le fuseau horaire local n'est pas UTC.
Timothy C. Quinn

21

En Python 3.6+:

import datetime

timestamp = 1579117901
value = datetime.datetime.fromtimestamp(timestamp)
print(f"{value:%Y-%m-%d %H:%M:%S}")

Production:

2020-01-15 19:51:41

Explication:


Excellente réponse, mais souhaitant montrer comment vous pouvez enregistrer la date dans une chaîne, et pas seulement l'imprimer: value.strftime ('% Y-% m-% d% H:% M:% S')
bjornasm

6
import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')
print temp

6

Une autre façon de le faire en utilisant la fonction gmtime et format;

from time import gmtime
print('{}-{}-{} {}:{}:{}'.format(*gmtime(1538654264.703337)))

Production: 2018-10-4 11:57:44


1

j'ai juste utilisé avec succès:

>>> type(tstamp)
pandas.tslib.Timestamp
>>> newDt = tstamp.date()
>>> type(newDt)
datetime.date

0

une doublure rapide et sale:

'-'.join(str(x) for x in list(tuple(datetime.datetime.now().timetuple())[:6]))

«2013-5-5-1-9-43»


3
Ou plus concis: '-'. Join (map (str, datetime.datetime.now (). Scheduple () [: 6]))
Jelle Zijlstra

2
@JelleZijlstra Eh, je préfère de loin l'expression du générateur à la carte.
crhodes

4
Quel type de format de date est '2013-5-5-1-9-43'? Je n'ai jamais vu ce format nulle part comme une représentation valide d'une date / heure.
madoki

pouvez-vous préciser ce qui qualifie cela de représentation invalide @madoki? voulez-vous dire non standard? Le principal avantage qu'il a sur la plupart des autres réponses est la possibilité de l'inclure dans un chemin de fichier ou de répertoire, car les espaces et les deux-points ne font pas partie de l'ensemble des caractères de répertoire Unix standard. voir par exemple stackoverflow.com/a/458001/209246
eqzx

0

Vous pouvez utiliser easy_date pour simplifier:

import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")

5
Chaque programmation a ses propres convertisseurs de date et d'heure. On ne devrait jamais avoir à utiliser des mods / frameworks pour cela
JosFabre

strptimeet strftimen'est pas intuitif ... Et même pas lisible ... Mais je comprends et respecte votre opinion
Raphael Amoedo

4
Que l'on ne devrait "jamais avoir à utiliser" est faux. Cela dépend de la langue et de la qualité des bibliothèques intégrées. Javascript a moments.js et Java avait le temps Joda qui sont tous deux plus populaires que les utilitaires de conversion de date et d'heure intégrés respectifs (si bien que le temps Joda a plus tard influencé les bibliothèques standard mises à jour de Java 8). Cela dit, à moins que la question n'appelle de belles bibliothèques tierces, il est préférable de donner une réponse basée sur la bibliothèque standard.
Hejazzman

Je suis corrigé @NikosVentouras. Je viens d'avoir le problème "La date JS dans IE se comporte différemment" pour la première fois. J'ai donc fini par utiliser moment.js
JosFabre
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.