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


J'ai une chaîne représentant un horodatage unix ("1284101485") en Python, et je voudrais le convertir en une date lisible. Quand j'utilise time.strftime, J'ai 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

576
2017-09-10 06:56


origine


Réponses:


Utilisation datetime module:

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

Dans ce code datetime.datetime peut sembler étrange, mais 1er datetime est le nom du module et le second est le nom de la classe. Alors datetime.datetime.fromtimestamp() est fromtimestamp() méthode de datetime classe de datetime module.


862
2017-09-10 07:09



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

Pris à partir de http://seehuhn.de/pages/pdate


178
2017-09-10 06:59



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


122
2018-05-12 13:23



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

66
2017-09-10 08:28



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 méthode portable pour obtenir l'heure locale qui fonctionne même si le fuseau horaire local avait un décalage utc différent dans le passé et python n'a pas accès à la base de données tz est d'utiliser un pytz fuseau horaire:

#!/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 pourraient affecter quelle date est retourné 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 compatible avec timezone en utilisant uniquement stdlib (le décalage UTC peut être incorrect 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)"))

Fonctions de la time module sont des wrappers minces autour de l'API C correspondante et par conséquent ils peuvent être moins portables que les datetime méthodes 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))  

39
2017-11-23 16:30



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'


32
2017-12-27 02:11



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

22
2018-03-07 07:30



Autre que d'utiliser heure / date / heure paquet, pandas peut également être utilisé pour résoudre le même problème.Voici comment nous pouvons utiliser pandas convertir horodatage à date lisible:

Les horodatages peuvent être dans deux formats:

  1. 13 chiffres (millisecondes) - 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) - 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'
    

7
2018-03-07 13:14



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

3
2018-02-05 13:29



J'ai juste utilisé avec succès:

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

1
2018-01-16 00:44