Conversione della stringa timestamp di unix in data leggibile in Python


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


Answers


Utilizza il modulo datetime :

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

In questo codice datetime.datetime può sembrare strano, ma 1st datetime è il nome del modulo e 2nd è il nome della classe. Quindi datetime.datetime.fromtimestamp() è fromtimestamp() metodo fromtimestamp() della classe datetime dal modulo datetime .




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

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




La risposta più votata suggerisce l'uso di fromtimestamp che è soggetto ad errori poiché utilizza il fuso orario locale. Per evitare problemi, un approccio migliore è utilizzare UTC:

datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')

Dove posix_time è l'ora Epoca Posix che si desidera convertire




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



Per un timestamp leggibile da un timestamp UNIX, ho usato questo negli script prima:

import os, datetime

datetime.datetime.fromtimestamp(float(os.path.getmtime("FILE"))).strftime("%B %d, %Y")

Produzione:

"26 dicembre 2012"




Puoi convertire l'ora corrente in questo modo

t=datetime.fromtimestamp(time.time())
t.strftime('%Y-%m-%d')
'2012-03-07'

Per convertire una data in stringa in diversi formati.

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



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



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



una fodera veloce e sporca:

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

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




ho usato con successo:

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



Puoi usare easy_date per semplificare:

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



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