Come convertire il timestamp intero in datetime Python


189

Ho un file di dati contenente timestamp come "1331856000000". Sfortunatamente, non ho molta documentazione per il formato, quindi non sono sicuro di come sia formattato il timestamp. Ho provato di serie di Python datetime.fromordinal()e datetime.fromtimestamp()e pochi altri, ma le partite niente. Sono abbastanza sicuro che quel determinato numero corrisponda alla data corrente (es. 2012-3-16), ma non molto di più.

Come faccio a convertire questo numero in a datetime?

Risposte:


329

datetime.datetime.fromtimestamp()è corretto, tranne per il fatto che probabilmente hai il timestamp in millisecondi (come in JavaScript), ma ti fromtimestamp()aspetta il timestamp di Unix, in pochi secondi.

Fallo così:

>>> import datetime
>>> your_timestamp = 1331856000000
>>> date = datetime.datetime.fromtimestamp(your_timestamp / 1e3)

e il risultato è:

>>> date
datetime.datetime(2012, 3, 16, 1, 0)

Risponde alla tua domanda?

EDIT : JF Sebastian ha suggerito correttamente di usare la vera divisione per 1e3(float 1000). La differenza è significativa, se desideri ottenere risultati precisi, ho modificato la mia risposta. La differenza deriva dal comportamento predefinito di Python 2.x, che ritorna sempre intquando si divide (usando l' /operatore) intper int(questo si chiama divisione del pavimento ). Sostituendo il divisore 1000(essendo un int) con il 1e3divisore (essendo rappresentazione di 1000come float) o con float(1000)(o 1000.ecc.), La divisione diventa vera divisione . Python 2.x ritorna floatquando si divide intper float, floatper int,floatdafloatecc. E quando c'è una parte frazionaria nel timestamp passato al fromtimestamp()metodo, il risultato di questo metodo contiene anche informazioni su quella parte frazionaria (come il numero di microsecondi).


13
usa la vera divisione:/ 1e3
jfs

@JFSebastian: hai perfettamente ragione, ho modificato la mia risposta e aggiunto alcune spiegazioni sul perché hai ragione. Se non sei d'accordo con la spiegazione, per favore fatemelo sapere.
Tadeck,

@ manu-fatto: Non importa davvero. x * 0.001e x / 1e3sono entrambi uguali, la differenza sta nella notazione e nella lunghezza (quella originale è più corta). Per alcune persone potrebbe essere più chiaro dividere effettivamente per il numero anziché moltiplicarlo per il numero inverso moltiplicativo ( 1/x), che hai proposto. Ma grazie per aver proposto un approccio alternativo.
Tadeck,

58
Questa funzione è pericolosa perché ti tiene conto del fuso orario. Prova a cercare utcfromtimestamp
Haim Bender

12
@HaimBender Grazie! Sento che i tuoi commenti meritano più attenzioni. fromtimestampti dà la data e l'ora in ora locale utcfromtimestampti dà la data e l'ora in UTC.
yusong,
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.