2012-08-08 11 views
11

Come ottengo l'ora UNIX da numpy.datetime64 o numpy.datetime_?Come ottenere un timestamp unix da numpy.datetime64

quanto a per esempio:

np.datetime_('2012-08-08 13:37:00') 
+1

secondo i documenti datetime64 non è realmente affidabile in [numpy 1.6] (http://docs.scipy.org/doc/numpy/reference/arrays.datetime.html#differences-between-1-6-and- 1-7-dateTimes). Anche per 1.7 l'api è sperimentale. Quindi non sono sicuro, se otterrete risultati coerenti su diverse piattaforme e architetture (64 bit?). Ulteriori informazioni sono fornite nelle [note di rilascio di pandas 0.8] (http://pandas.pydata.org/pandas-docs/dev/whatsnew.html#potential-porting-issues-for-pandas-0-7-3- utenti). Quindi non sono sicuro, se è una buona scelta usare datetime64 su numpy 1.6. – bmu

+0

Sì okey, dal momento che il codice sarà sperimentale di per sé e risiederà in una sola macchina può essere considerato funzionante se funziona una volta nel modo giusto? – SlimJim

+0

ok, ma allora dovresti specificare la versione numpy, la piattaforma e l'architettura (magari la versione python, gli stessi risultati su 2 e 3?) Nella tua domanda. altrimenti potrebbe essere fuorviante per qualcuno che lo legge. – bmu

risposta

4

Ottengo risultati incoerenti per il valore di np.datetime64('now') su numpy 1.6.1 contro 1.7.

Questo funziona su entrambi:

>>> import datetime 
>>> import numpy as np 
>>> now = np.datetime64(datetime.datetime.now()) 
>>> (now.astype('uint64')/1e6).astype('uint32') 
1344447810 
+1

Ottengo 1344384000000000, 2 ore dopo ;-). Sono su una macchina a 64 bit e tz utc + 2. – bmu

+0

in 1.6.1 + Ubuntu, ottengo il numero a 64 bit, ma sul mio mac con 1.7.0-dev, ottengo il valore a 32 bit .. – jterrace

+0

@bmu risposta aggiornata - sembra essere diverso su 1.6.1 vs 1.7 – jterrace

0
def get_unixtime(time):  
    return (time.astype(np.int64)/1e6).astype(np.int64) 
get_unixtime(np.datetime64('now')) 

sembra restituire il timestamp UNIX, ho controllato solo con alcune date.

+0

Hai effettivamente provato questo? Ottengo 1344 – jterrace

+0

Ottengo 1344384000, 2 ore più tardi ;-). Sono su una macchina a 64 bit e tz utc + 2. – bmu

+0

@jterrace, sì ho provato, sto eseguendo l'ultimo numpy su Ubuntu a 64 bit anche testato su Vista a 64 bit. Ottengo 1344384000 – SlimJim

4

NumPy datetime64 ha unità variabili:

estratti da official doc:

L'unità di memorizzazione interna viene automaticamente selezionato dalla forma della stringa e può essere un'unità di data o un'unità di tempo. Le unità di data sono anni ('Y'), mesi ('M'), settimane ('W') e giorni ('D'), mentre le unità di tempo sono ore ('h'), minuti ('m'), secondi ('s'), millisecondi ('ms') e alcune unità aggiuntive basate sui prefissi SI-prefisso.

Quindi, in primo luogo abbiamo bisogno di controllare l'unità di corrente utilizzando DTYPE, ad esempio:

>>> now = np.datetime64(datetime.datetime.now()) 
>>> now.dtype 

# for ns unit, use: 
dtype('<M8[ns]') 
now.astype('int64')/1e9, dtype='int32' 

# for us unit, use: 
dtype('<M8[us]') 
now.astype('int64')/1e6, dtype='int32' 

# for ms unit, use: 
dtype('<M8[ms]') 
now.astype('int64')/1e3, dtype='int32' 

e così via ....

2

Al fine di tener conto delle unità, credo è necessario fare qualcosa di simile:

def get_unixtime(dt64): 
    return dt64.astype('datetime64[s]').astype('int') 

si noti che questo si trasforma in 'secondi' (il [s]) prima della conversione a intero S. Funziona su NumPy 1.12.1.