2011-07-15 9 views
11

Qualcuno potrebbe dirmi come ottenere il datetime da float in python?Recupero datetime da float e viceversa in python

Per esempio, ho il numero float come diciamo 43111.0, ora voglio ottenere il datetime per questo.

+3

Cos'è 43.111,0 dovrebbe essere? È un qualche strano timestamp non standard? – Jacob

+1

43111 è il formato numerico per la data dell'11 gennaio 2018. – Pravin

+1

Hai una specifica o qualcosa del genere? – Jacob

risposta

5
import datetime, time 

print datetime.datetime.fromtimestamp(time.time()) 
print datetime.datetime.fromtimestamp(43111.0) 
+0

Grazie per la risposta, ma 43111.0 non è il timestamp, è il formato del numero di flaot per la data dell'11 gennaio 2018. – Pravin

5

Così, con un po 'di matematica:

Se 43111 è 11 Gennaio 2018, quindi 0 è 30 dicembre 1899. Python ha datetime.date.fromordinal()

Ritorna la data corrispondente al calendario Gregoriano prolettico ordinale, dove 1 ° gennaio dell'anno 1 ha ordinale 1. ValoreErrore viene generato a meno che 1 < = ordinale < = date.max.toordinal(). Per qualsiasi data d, date.fromordinal (d.toordinal()) == d.

Se si utilizza che con un offset, si dispone:

>>> dateoffset = 693594 
>>> datetime.date.fromordinal(dateoffset + 43111) 
datetime.date(2018, 1, 11) 

Speranza che aiuta, anche se non funziona per i galleggianti.

+0

Funziona su vecchi Python. ;) –

+0

Se si utilizzano gli ordinali, si deve gestire separatamente la parte frazionaria :( – mlt

20

Sembra un formato datetime di Excel, denominato serial date. Veloce e modo sporco di convertirlo:

>>> import datetime 
>>> serial = 43111.0 
>>> seconds = (serial - 25569) * 86400.0 
>>> datetime.datetime.utcfromtimestamp(seconds) 
datetime.datetime(2018, 1, 11, 0, 0) 
+0

Secondo me, questo non è troppo sporco, dato che le date di Excel sono in realtà solo un timestamp con un diverso punto di partenza. 1) fromtimestamp() include informazioni sul fuso orario, che possono o non possono essere desiderabili (immagino che di solito non sia desiderabile - notate il 2, 0 alla fine del risultato) .Per eliminare questo, usate utcfromtimestamp(). 2) Questo metodo non può supportare date precedenti al 1970. –

+0

Modificato la mia risposta per usare utcfromtimestamp() :) – tuomur

1

Prova questa:

from datetime import datetime 

datetime.fromtimestamp(*your_timestamp_here*).strftime('%Y-%m-%d') 
Problemi correlati