2012-08-08 25 views
11

¿Cómo obtengo el tiempo de UNIX desde numpy.datetime64 o numpy.datetime_?Cómo obtener la marca de tiempo de unix desde numpy.datetime64

Como por ejemplo en:

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

de acuerdo con los documentos datetime64 no es realmente confiable en [numpy 1.6] (http://docs.scipy.org/doc/numpy/reference/arrays.datetime.html#differences-between-1-6-and- 1-7-datetimes). Incluso para 1.7, la API es experimental. Entonces, no estoy seguro si obtendrás resultados consistentes en diferentes plataformas y arquitecturas (¿64 bits?). Se proporciona más información en [pandas 0.8 notas de la versión] (http://pandas.pydata.org/pandas-docs/dev/whatsnew.html#potential-porting-issues-for-pandas-0-7-3- usuarios). Así que no estoy seguro, si es una buena opción usar datetime64 en numpy 1.6 en absoluto. – bmu

+0

Sí okey, dado que el código va a ser experimental en sí mismo y solo reside en una máquina, puede considerarse que funciona si funciona una vez, ¿verdad? – SlimJim

+0

bien, pero luego debe especificar la versión numpy, la plataforma y la arquitectura (tal vez la versión de Python, los mismos resultados en 2 y 3?) En su pregunta. de lo contrario, podría ser engañoso para alguien que lo lea. – bmu

Respuesta

4

Obtengo resultados inconsistentes para el valor de np.datetime64('now') en numpy 1.6.1 contra 1.7.

Esto funciona en ambos:

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

obtengo 1344384000000000, 2 horas después ;-). Estoy en una máquina de 64 bits y tz utc + 2. – bmu

+0

en 1.6.1 + Ubuntu, obtengo el número de 64 bits, pero en mi mac con 1.7.0-dev, obtengo el valor de 32 bits ... – jterrace

+0

@bmu respuesta actualizada - parece ser diferente en 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')) 

parece devolver la marca de tiempo UNIX, sólo he comprobado con algunas fechas.

+0

¿De hecho lo has probado? Obtengo 1344 – jterrace

+0

Recibo 1344384000, 2 horas después ;-). Estoy en una máquina de 64 bits y tz utc + 2. – bmu

+0

@jterrace, sí, probé, estoy ejecutando el último numpy en un Ubuntu de 64 bits y también lo probé en Vista de 64 bits. Obtengo 1344384000 – SlimJim

4

numpy datetime64 tiene unidades variables:

extraídos de official doc:

La unidad para el almacenamiento interno se selecciona de forma automática desde la forma de la cadena de y puede ser una unidad de fecha o una unidad de tiempo. Las unidades de fecha son años ('Y'), meses ('M'), semanas ('W') y días ('D'), mientras que las unidades de tiempo son horas ('h'), minutos ('m'), segundos ('s'), milisegundos ('ms') y algunas unidades basadas en segundos de prefijo SI adicionales.

Por lo tanto, primero tenemos que comprobar la unidad actual utilizando dtype, por ejemplo:

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

y así sucesivamente ....

2

Con el fin de dar cuenta de las unidades, creo que tiene que hacer algo como:

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

Tenga en cuenta que este se convierte en 'segundos' (el [s]) antes de convertir a entero s. Esto funciona en NumPy 1.12.1.

Cuestiones relacionadas