[Python] Conversione della stringa timestamp di unix in data leggibile


Answers

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

Tratto da http://seehuhn.de/pages/pdate

Question

Ho una stringa che rappresenta un timestamp unix (ad esempio "1284101485") in Python e mi piacerebbe convertirlo in una data leggibile. Quando uso time.strftime , ottengo 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



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



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



Hai guardato il pacchetto datetime? Credo che abbia un metodo fromUnixTimestamp.




Ci sono due parti:

  1. Converti il ‚Äč‚Äčtimestamp unix ("seconds from epoch") all'ora locale
  2. Visualizza l'ora locale nel formato desiderato.

Un modo portatile per ottenere l'ora locale che funziona anche se il fuso orario locale ha avuto un diverso offset dell'utc nel passato e python non ha accesso al database tz è quello di utilizzare un fuso orario 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)

Per visualizzarlo, puoi utilizzare qualsiasi formato orario supportato dal tuo sistema, ad esempio:

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

Se non hai bisogno di un'ora locale, per ottenere un tempo UTC leggibile invece:

utc_time = datetime.utcfromtimestamp(unix_timestamp)
print(utc_time.strftime("%Y-%m-%d %H:%M:%S.%f+00:00 (UTC)"))

Se non ti interessa i problemi del fuso orario che potrebbero influire su quale data viene restituita o se python ha accesso al database tz sul tuo sistema:

local_time = datetime.fromtimestamp(unix_timestamp)
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f"))

Su Python 3, è possibile ottenere un datetime timezone using solo stdlib (l'offset UTC potrebbe essere sbagliato se python non ha accesso al database tz sul proprio sistema, ad esempio, su 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)"))

Le funzioni del modulo time sono involucri sottili attorno all'API C corrispondente e quindi potrebbero essere meno portabili rispetto ai corrispondenti metodi datetime , altrimenti potresti usarli anche:

#!/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))  



C'è un modo interessante in cui non devi preoccuparti dei fusi orari, utc, ecc. Converti semplicemente la stringa in formato data Excel e quindi in una data / ora leggibile:

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)



Oltre a usare il pacchetto time / datetime , i panda possono anche essere usati per risolvere lo stesso problema. Ecco come possiamo usare i panda per convertire il timestamp in data leggibile :

I timestamp possono essere in due formati:

  1. 13 cifre (millisecondi) - Per convertire millisecondi ad oggi, utilizzare:

    import pandas
    result_ms=pandas.to_datetime('1493530261000',unit='ms')
    str(result_ms)
    
    Output: '2017-04-30 05:31:01'
    
  2. 10 cifre (secondi) - Per convertire i secondi fino alla data, utilizzare:

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