Conversione della stringa timestamp unix in data leggibile


826

Ho una stringa che rappresenta un timestamp unix (cioè "1284101485") in Python, e vorrei 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

1
link alla domanda per la riconversione: stackoverflow.com/q/19801727/3273031
fangoso

Risposte:


1210

Usa il datetimemodulo:

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

131
.fromtimestamp()potrebbe non riuscire per le date passate se un fuso orario locale avesse un offset utc diverso. È necessario un database di fuso orario storico come quello fornito dal pytzmodulo (o dal sistema operativo). O semplicemente lavora in UTC e usa .utcfromtimestamp().
jfs,

9
@JFSebastian Hai menzionato che questo potrebbe fallire in un paio di commenti - per favore, potresti spiegarmi il motivo per cui avrebbe fallito per date / orari passati? (A giudicare dai voti, molte persone sono entrambe d'accordo con te e lo vedono come semplice) Sicuramente ogni timestamp unix ha una semplice data / ora equivalente?
davidhood2

3
@ davidhood2 utilizza un sistema in cui python non ha accesso al database tz (Windows), imposta il fuso orario locale su un fuso orario che aveva un offset UTC diverso in passato (ad esempio Europa / Mosca), chiama da timestamp () con i timestamp del passato (2011-). Confronta i risultati con i valori calcolati utilizzando pytz. Se non è chiaro; porre una domanda di overflow dello stack separata.
jfs,

3
@ davidhood2: ho pubblicato la mia risposta che dimostra la pytzsoluzione .
jfs,

6
Un punto di importazione è che questo richiede un timestamp in secondi dall'epoca; se hai millisecondi devi dividere per 1000 come ho appena scoperto.
parole per caso,


145

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

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

Dove posix_time è il tempo di Posix che desideri convertire


2
import datetime, pytz datetime.datetime (1990, 1, 1, tzinfo = pytz.utc)
y.selivonchyk

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

10
time.ctime()e time.localtime()potrebbe non riuscire per le date passate se un fuso orario locale avesse un offset utc diverso. È necessario un database di fuso orario storico come quello fornito dal pytzmodulo (o dal sistema operativo). O semplicemente lavora in UTC e usa time.gmtime(). datetimepotrebbe fornire un intervallo di date più ampio, quindi datetime.utcfromtimestamp()potrebbe essere utilizzato al posto delle timefunzioni.
jfs

66

Ci sono due parti:

  1. Convertire il timestamp unix ("secondi dall'epoca") all'ora locale
  2. Visualizza l'ora locale nel formato desiderato.

Un modo portatile per ottenere l'ora locale che funzioni anche se in passato il fuso orario locale aveva un offset utc diverso e python non ha accesso al database tz è utilizzare un pytzfuso orario:

#!/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, è possibile utilizzare qualsiasi formato orario supportato dal proprio 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 è necessaria l'ora locale, per ottenere invece un'ora UTC leggibile:

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

Se non ti interessano i problemi di fuso orario che potrebbero influire sulla data 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, potresti ottenere un datetime sensibile al fuso orario usando solo stdlib (l'offset UTC potrebbe essere errato se python non ha accesso al database tz sul tuo 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 timemodulo sono wrapper sottili attorno all'API C corrispondente e quindi potrebbero essere meno portatili dei datetimemetodi corrispondenti , altrimenti potresti usarle 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))  

Dovrebbe essere la risposta più votata se ti interessa l'ora locale.
azzamsa,

36

Per un timestamp leggibile dall'uomo da un timestamp UNIX, l'ho usato prima negli script:

import os, datetime

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

Produzione:

'26 dicembre 2012'


25

È possibile 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

24

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 i millisecondi fino 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 ad oggi, utilizzare:

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

Sembra un'altra vittoria per i panda - il modulo è fantastico in tutto
Vaidøtas Ivøška

21
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')

Ottieni la data leggibile dal timestamp anche con l'ora, inoltre puoi cambiare il formato della data.


5
Cosa aggiunge questa risposta a questa risposta?
Kocica,

1
Aggiungi un avviso relativo al problema dell'assunzione del fuso orario locale. Le migliori pratiche nella programmazione sono di memorizzare i timestamp come orari UTC anziché i timestamp locali. Ma questo esempio sopra restituirà l'ora sbagliata se il fuso orario locale non è UTC.
Timothy C. Quinn,

21

In Python 3.6+:

import datetime

timestamp = 1579117901
value = datetime.datetime.fromtimestamp(timestamp)
print(f"{value:%Y-%m-%d %H:%M:%S}")

Produzione:

2020-01-15 19:51:41

Spiegazione:


Ottima risposta, ma desideri che hai mostrato come salvare la data in una stringa e non solo stamparla: value.strftime ('% Y-% m-% d% H:% M:% S')
bjornasm

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

6

Un altro modo in cui ciò può essere fatto usando gmtime e la funzione format;

from time import gmtime
print('{}-{}-{} {}:{}:{}'.format(*gmtime(1538654264.703337)))

Produzione: 2018-10-4 11:57:44


1

ho appena usato con successo:

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

0

una fodera veloce e sporca:

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

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


3
O più concisamente: '-'. Join (map (str, datetime.datetime.now (). Timetuple () [: 6]))
Jelle Zijlstra l'

2
@JelleZijlstra Eh, preferisco di gran lunga l'espressione del generatore sulla mappa.
cripte

4
Che tipo di formato della data è "2013-5-5-1-9-43"? Non ho mai visto questo formato da nessuna parte come una rappresentazione valida di una data / ora.
madoki,

puoi approfondire ciò che lo qualifica come una rappresentazione non valida @madoki? vuoi dire non standard? Il vantaggio principale che ha sulla maggior parte delle altre risposte è la possibilità di includerlo in un percorso di file o directory, poiché spazi e due punti non sono nel set di caratteri di directory unix standard. si veda ad esempio stackoverflow.com/a/458001/209246
eqzx

0

Puoi usare easy_date per semplificare:

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

5
Ogni programmazione ha i propri convertitori di data e ora. Non si dovrebbe mai usare mod / framework per questo
JosFabre

strptimee strftimenon è intuitivo ... E nemmeno non leggibile ... Ma capisco e rispetto la tua opinione
Raphael Amoedo,

4
Che uno non debba "mai usare" è sbagliato. Dipende dalla lingua e dalla qualità delle librerie integrate. Javascript ha moments.js e Java hanno avuto il tempo Joda che sono entrambi più popolari dei rispettivi programmi di utilità di conversione di data e ora incorporati (così tanto che il tempo di Joda in seguito ha influenzato le librerie standard aggiornate di Java 8). Detto questo, a meno che la domanda non richieda belle librerie di terze parti, è preferibile dare una risposta basata sulla libreria standard.
Hejazzman,

Sono corretto @NikosVentouras. Ho appena avuto il problema "JS Date in IE si comporta diversamente" per la prima volta. Così ho finito per usare moment.js
JosFabre il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.