¿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')
¿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')
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
obtengo 1344384000000000, 2 horas después ;-). Estoy en una máquina de 64 bits y tz utc + 2. – bmu
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
@bmu respuesta actualizada - parece ser diferente en 1.6.1 vs 1.7 – jterrace
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.
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 ....
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.
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
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
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