Conversion de la chaîne de timestamp unix en date lisible
j'ai une chaîne représentant un timestamp unix (i.e." 1284101485") en Python, et j'aimerais la convertir en une date lisible. Quand j'utilise time.strftime
, j'obtiens 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
15 réponses
utiliser datetime
module:
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 puisqu'il utilise le fuseau horaire local. Pour éviter les problèmes une meilleure approche est D'utiliser UTC:
datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')
où posix_time est le temps Posix epoch que vous voulez 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:
- convertissez le timestamp unix ("secondes depuis l'époque") en heure locale
- afficher l'heure locale dans le format désiré.
une façon portable d'obtenir l'heure locale qui fonctionne même si le fuseau horaire local a eu un décalage utc différent dans le passé et que python n'a pas accès à la base de données tz est d'utiliser un pytz
timezone:
#!/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 temporel 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 quelle date est retournée 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 conscient du fuseau horaire en utilisant seulement stdlib (le décalage UTC peut être erroné 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 module time
sont des enveloppements minces autour de L'API C correspondante et peuvent donc être moins portables que les méthodes datetime
correspondantes sinon vous pourriez 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 une estampille de temps lisible par un humain à partir D'une estampille de temps UNIX, Je l'ai utilisé dans les scripts avant:
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 en chaîne de caractères 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
autrement que par heure/date heure package pandas peut également être utilisé pour résoudre le même problème.Voici comment nous pouvons utiliser pandas pour convertir timestamp en date lisible :
Timestamps peuvent être dans deux formats:
-
13 chiffres (millisecondes)) - Pour convertir millisecondes à ce jour, utiliser:
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 à ce jour, utilisez:
import pandas result_s=pandas.to_datetime('1493530261',unit='s') str(result_s) Output: '2017-04-30 05:31:01'
import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')
print temp
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')
obtenir la date lisible de timestamp avec le temps aussi, vous pouvez changer le format de la date.
je viens d'utiliser avec succès:
>>> type(tstamp)
pandas.tslib.Timestamp
>>> newDt = tstamp.date()
>>> type(newDt)
datetime.date
rapide et sale un liner:
'-'.join(str(x) for x in list(tuple(datetime.datetime.now().timetuple())[:6]))
'2013-5-5-1-9-43'
vous pouvez utiliser easy_date pour le rendre facile:
import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")
il y a une façon intéressante où vous n'avez pas à vous soucier des fuseaux horaires, utc, etc. Il suffit de convertir la chaîne dans le format de date Excel, puis à une date/heure lisible:
import datetime
def xldate_to_datetime(xldate):
temp = datetime.datetime(1899, 12, 30)
delta = datetime.timedelta(days=xldate)
return temp+delta
ts = "1284101485"
tsxl = ((int(ts)/60)/60)/24 + 25569
readabledate = xldate_to_datetime(tsxl)
print(readabledate)
avez-vous regardé le paquet datetime? Je crois qu'il a une méthode fromUnixTimestamp.