J'ai une chaîne représentant un horodatage Unix (c'est-à-dire "1284101485") en Python, et j'aimerais la convertir en une date lisible. Quand j'utilise time.strftime
, je reçois un 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
Utilisez le module datetime
:
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'))
>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)
Tiré de http://seehuhn.de/pages/pdate
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 l'heure Posix Epoch que vous souhaitez convertir
>>> 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'
Il y a deux parties:
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 fuseau horaire pytz
:
#!/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:
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 quelle date est renvoyé ou si python a accès à la base de données tz de 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 une date/heure compatible avec le fuseau horaire en utilisant uniquement stdlib (le décalage UTC peut être erroné si python n'a pas accès à la base de données tz de votre système, par exemple sous 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 module time
sont des enveloppes minces autour de l'API C correspondante et peuvent donc être moins portables que les méthodes datetime
correspondantes, sinon vous pouvez les utiliser aussi:
#!/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))
Pour un horodatage lisible par un humain à 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")
Sortie:
'26 décembre 2012'
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 sous forme de chaîne en 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
Autre que l’utilisation de heure/date/heure paquet, pandas peut également être utilisé pour résoudre le même problème. Voici comment nous pouvons utiliser pandas pour convertir - horodatage à date lisible:
Les horodatages peuvent être sous deux formats:
13 chiffres (millisecondes) - Pour convertir millisecondes à ce jour, utilisez:
import pandas
result_ms=pandas.to_datetime('1493530261000',unit='ms')
str(result_ms)
Output: '2017-04-30 05:31:01'
10 chiffres (secondes) - Pour convertir secondes en date, utilisez:
import pandas
result_s=pandas.to_datetime('1493530261',unit='s')
str(result_s)
Output: '2017-04-30 05:31:01'
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 le temps aussi, vous pouvez aussi changer le format de la date.
Une autre façon de procéder consiste à utiliser gmtime et la fonction format;
from time import gmtime
print('{}-{}-{} {}:{}:{}'.format(*gmtime(1538654264.703337)))
Sortie: 2018-10-4 11:57:44
import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')
print temp
je viens d'utiliser avec succès:
>>> type(tstamp)
pandas.tslib.Timestamp
>>> newDt = tstamp.date()
>>> type(newDt)
datetime.date
Vous pouvez utiliser easy_date pour simplifier les choses:
import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")
une doublure rapide et sale:
'-'.join(str(x) for x in list(Tuple(datetime.datetime.now().timetuple())[:6]))
'2013-5-5-1-9-43'