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
VeryNewToPython
la source
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'))
Michał Niklas
la source
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
@ davidhood2: J'ai publié ma propre réponse qui illustre la pytzsolution .
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
246
>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)

Tiré de http://seehuhn.de/pages/pdate

Daniel
la source
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

rkachach
la source
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'
John La Rooy
la source
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))  
jfs
la source
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'

Jared Burrows
la source
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
pseudo
la source
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'
shubham
la source
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.

Rishabh Jhalani
la source
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:

Contango
la source
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
itsaruns
la source
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

h3xus
la source
1

j'ai juste utilisé avec succès:

>>> type(tstamp)
pandas.tslib.Timestamp
>>> newDt = tstamp.date()
>>> type(newDt)
datetime.date
nimmy
la source
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»

eqzx
la source
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")
Raphael Amoedo
la source
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