web-dev-qa-db-fra.com

Conversion de chaîne d'horodatage Unix en date lisible

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
734
VeryNewToPython

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'))
1095
Michał Niklas
>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)

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

219
Daniel

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

140
rkachach
>>> 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'
71
John La Rooy

Il y a deux parties:

  1. Convertir l'horodatage Unix ("secondes depuis l'époque") en heure locale
  2. Affiche 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 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))  
57
jfs

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'

34
Jared Burrows

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
24
Nick

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:

  1. 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'
    
  2. 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'
    
19
shubham
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.

14
Rishabh Jhalani

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

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

je viens d'utiliser avec succès:

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

Vous pouvez utiliser easy_date pour simplifier les choses:

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

une doublure rapide et sale:

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

'2013-5-5-1-9-43'

0
eqzx