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


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

Answers



Utiliser le module datetime :

import datetime
print(
    datetime.datetime.fromtimestamp(
        int("1284101485")
    ).strftime('%Y-%m-%d %H:%M:%S')
)

Dans ce code, datetime.datetime peut sembler étrange, mais 1st datetime est le nom du module et 2nd est le nom de la classe. Donc datetime.datetime.fromtimestamp() est la méthode fromtimestamp() de la classe datetime module datetime .




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

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




La réponse la plus votée suggère d'utiliser fromtimestamp qui est sujet à erreur 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 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'



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



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



une doublure rapide et sale:

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

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




J'ai juste utilisé avec succès:

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



Vous pouvez utiliser easy_date pour le rendre facile:

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



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