[Python] Conversion d'une chaîne d'horodatage unix en date lisible


Answers

>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)

Extrait de http://seehuhn.de/pages/pdate

Question

J'ai une chaîne représentant un timestamp unix (ie "1284101485") en Python, et je voudrais le 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



En plus d'utiliser le paquet time / datetime , les pandas peuvent aussi ê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 être dans deux formats:

  1. 13 chiffres (millisecondes) - Pour convertir des 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 à ce jour, utilisez:

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



Il y a une façon intéressante de ne pas avoir à se soucier des fuseaux horaires, des utc, etc. Il suffit de convertir la chaîne au format 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)



Il y a deux parties:

  1. Convertir l'horodatage unix ("secondes depuis l'époque") à l'heure locale
  2. 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 avait 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 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 à 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 peuvent 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 une date-heure timezone-aware en utilisant seulement stdlib (le décalage UTC peut être mauvais 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 de time sont des wrappers minces autour de l'API C correspondante et par conséquent, elles peuvent ê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))  



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



Avez-vous regardé le paquet datetime? Je crois qu'il a une méthode fromUnixTimestamp.




>>> 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'