¿Cómo convierto un numpy.datetime64objeto a datetime.datetime(o Timestamp)?
En el siguiente código, creo un objeto datetime, timestamp y datetime64.
import datetime
import numpy as np
import pandas as pd
dt = datetime.datetime(2012, 5, 1)
# A strange way to extract a Timestamp object, there's surely a better way?
ts = pd.DatetimeIndex([dt])[0]
dt64 = np.datetime64(dt)
In [7]: dt
Out[7]: datetime.datetime(2012, 5, 1, 0, 0)
In [8]: ts
Out[8]: <Timestamp: 2012-05-01 00:00:00>
In [9]: dt64
Out[9]: numpy.datetime64('2012-05-01T01:00:00.000000+0100')
Nota: es fácil obtener la fecha y hora de la marca de tiempo:
In [10]: ts.to_datetime()
Out[10]: datetime.datetime(2012, 5, 1, 0, 0)
Pero, ¿cómo extraemos el datetimeo Timestampde un numpy.datetime64( dt64)?
.
Actualización: un ejemplo algo desagradable en mi conjunto de datos (quizás el ejemplo motivador) parece ser:
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
que debería ser datetime.datetime(2002, 6, 28, 1, 0), y no mucho (!) ( 1025222400000000000L) ...

numpy,pandaslas versiones.pd.Timestamp(dt64).to_datetime(). Todavía estoy un poco insatisfecho con esto, ¡pero ciertamente Wes 'es menos específico para mi antiguo problema (y por lo tanto mejor para el mundo)! Gracias de nuevo por tomarse el tiempo para responder. :)Timestamp" yTimestampes unadatetime(una subclase de) de todos modos :)Respuestas:
Para convertir
numpy.datetime64a objeto datetime que represente la hora en UTC ennumpy-1.8:El ejemplo anterior supone que un objeto datetime ingenuo se interpreta
np.datetime64como hora en UTC.Para convertir datetime a np.datetime64 y back (
numpy-1.6):Funciona tanto en un solo objeto np.datetime64 como en una matriz numpy de np.datetime64.
Piense en np.datetime64 de la misma manera que lo haría con np.int8, np.int16, etc. y aplique los mismos métodos para convertir entre objetos de Python como int, datetime y los objetos numpy correspondientes.
Su "ejemplo desagradable" funciona correctamente:
Puedo reproducir el
longvalor ennumpy-1.8.0instalado como:El mismo ejemplo:
Devuelve
longporque fornumpy.datetime64type.astype(datetime)es equivalente a.astype(object)eso devuelve Python integer (long) onnumpy-1.8.Para obtener el objeto de fecha y hora, podría:
Para obtener datetime64 que usa segundos directamente:
Los documentos numpy dicen que la API de fecha y hora es experimental y puede cambiar en futuras versiones numpy.
fuente
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100'), lo que da un largo (1025222400000000000L) (!)type(dt64).dt64.astype(datetime) == datetime.utcfromtimestamp(dt64.astype(int)*1e-6)type(dt64)esnumpy.datetime64ydt64.astype(datetime)es el mismo int largo ...: snumpy.__version__->'1.6.1'Simplemente puede usar el constructor pd.Timestamp. El siguiente diagrama puede ser útil para esta y otras preguntas relacionadas.
fuente
pd.to_datetimeconvierte todo apd.Timestamp. Unpd.Timestampobjeto tiene el métodoto_pydatetimepara volver a undatetime.datetimeobjeto y unto_datetime64método para convertirlonp.datetime64.Bienvenido al infierno.
Puede pasar un objeto datetime64 a
pandas.Timestamp:Noté que esto no funciona bien en NumPy 1.6.1:
Además,
pandas.to_datetimese puede usar (esto está fuera de la versión de desarrollo, no he comprobado v0.9.1)fuente
issubclass(pd.Timestamp, datetime)esTrue. Y laTimestampclase misma tieneto_datetime()método.pd.to_datetime('2012-05-01T01:00:00.000000+0100')regresaTimestamp('2012-05-01 00:00:00')al menos en pandas0.17.1.Creo que podría haber un esfuerzo más consolidado en una respuesta para explicar mejor la relación entre el módulo datetime de Python, el datetime64 / timedelta64 de numpy y los objetos Timestamp / Timedelta de pandas.
La biblioteca estándar de fecha y hora de Python
La biblioteca estándar de fecha y hora tiene cuatro objetos principales.
Crea estos cuatro objetos
Objetos datetime64 y timedelta64 de NumPy
NumPy no tiene objetos de fecha y hora separados, solo un objeto datetime64 para representar un solo momento en el tiempo. El objeto datetime del módulo datetime tiene una precisión de microsegundos (una millonésima de segundo). El objeto datetime64 de NumPy le permite establecer su precisión desde horas hasta attosegundos (10 ^ -18). Su constructor es más flexible y puede tomar una variedad de entradas.
Construye los objetos datetime64 y timedelta64 de NumPy
Pase un número entero con una cadena para las unidades. Ver todas las unidades aquí . Se convierte a esa cantidad de unidades después de la época de UNIX: 1 de enero de 1970
También puede usar cadenas siempre que estén en formato ISO 8601.
Timedeltas tienen una sola unidad
También puede crearlos restando dos objetos datetime64
Pandas Timestamp y Timedelta crean mucha más funcionalidad además de NumPy
Una marca de tiempo de pandas es un momento en el tiempo muy similar a una fecha y hora pero con mucha más funcionalidad. Puede construirlos con
pd.Timestampopd.to_datetime.pd.to_datetimefunciona de manera muy similar (con algunas opciones más) y puede convertir una lista de cadenas en marcas de tiempo.Convertir Python datetime a datetime64 y Timestamp
Convertir numpy datetime64 a datetime y Timestamp
Convertir a marca de tiempo
Convertir de marca de tiempo a fecha y hora y fecha y hora64
Esto es bastante fácil ya que las marcas de tiempo de los pandas son muy poderosas
fuente
Para
DatetimeIndex, eltolistdevuelve una lista dedatetimeobjetos. Para un solodatetime64objeto, devuelve un solodatetimeobjeto.fuente
.item()que es mucho más explícita (y nadie puede venir y comenzar a argumentar que debería devolver una lista).dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100'), lo que da un largo (1025222400000000000L) (!).item()(sugerido por @seberg).tolist()depende de las unidades que use datetime64, por ejemplo,Dproducedatetime.date(),us(microsegundos) producedatetime.datetime(),ns(nanosegundos) producelong. Y las unidades cambian según los valores de entrada, por ejemplo,numpy.datetime64('2012-05-01')usos'D',numpy.datetime64('2012-05-01T00:00:00.000')usosms,numpy.datetime64('2012-05-01T00:00:00.000000000')usosns. Podría abrir un problema si lo encuentra confuso.Si desea convertir una serie completa de fechas de pandas a fechas y horas de Python normales, también puede usarlas
.to_pydatetime().También es compatible con zonas horarias:
NOTA : Si está operando en una Serie Pandas, no puede llamar
to_pydatetime()a toda la serie. Deberá llamar.to_pydatetime()a cada fecha y hora individual64 utilizando una lista de comprensión o algo similar:fuente
Una opción es usar
str, y luegoto_datetime(o similar):Nota: no es igual a
dtporque se ha vuelto "consciente del desplazamiento" :Esto parece poco elegante.
.
Actualización: esto puede tratar con el "ejemplo desagradable":
fuente
Esta publicación ha estado vigente durante 4 años y todavía luché con este problema de conversión, por lo que el problema aún está activo en 2017 en algún sentido. Me sorprendió un poco que la documentación numpy no ofrezca fácilmente un algoritmo de conversión simple, pero esa es otra historia.
He encontrado otra forma de hacer la conversión que solo involucra módulos
numpyydatetimeno requiere que se importen pandas, lo que me parece que es mucho código para importar para una conversión tan simple. Noté quedatetime64.astype(datetime.datetime)devolverá undatetime.datetimeobjeto si el originaldatetime64está en unidades de microsegundos, mientras que otras unidades devuelven una marca de tiempo entera. Uso el móduloxarraypara E / S de datos de archivos Netcdf que usadatetime64unidades en nanosegundos, lo que hace que la conversión falle, a menos que primero se convierta a unidades de micro segundos. Aquí está el código de conversión de ejemplo,Solo se probó en mi máquina, que es Python 3.6 con una distribución reciente de Anaconda 2017. Solo he visto la conversión escalar y no he verificado las conversiones basadas en matrices, aunque supongo que será bueno. Tampoco he mirado el código fuente de datetime64 numpy para ver si la operación tiene sentido o no.
fuente
Volví a esta respuesta más veces de las que puedo contar, así que decidí organizar una pequeña clase rápida, que convierte un
datetime64valor de Numpy en un valor de Pythondatetime. Espero que ayude a otros por ahí.Voy a guardar esto en mi bolsa de herramientas, algo me dice que lo necesitaré nuevamente.
fuente
ts.to_pydatetime()use esta función para obtener el objeto de fecha y hora nativo de pitones
fuente
replace() got an unexpected keyword argument 'tzinfo'Algunas soluciones me funcionan bien, pero numpy dejará en desuso algunos parámetros. La solución que funciona mejor para mí es leer la fecha como una fecha y hora de los pandas y extraer explícitamente el año, mes y día de un objeto de pandas. El siguiente código funciona para la situación más común.
fuente
de hecho, todos estos tipos de fecha y hora pueden ser difíciles y potencialmente problemáticos (debe realizar un seguimiento cuidadoso de la información de la zona horaria). Esto es lo que he hecho, aunque admito que me preocupa que al menos parte "no sea por diseño". Además, esto se puede hacer un poco más compacto según sea necesario. comenzando con un numpy.datetime64 dt_a:
numpy.datetime64 ('2015-04-24T23: 11: 26.270000-0700')
datetime.datetime (2015, 4, 25, 6, 11, 26, 270000)
... y, por supuesto, eso se puede comprimir en una línea según sea necesario.
fuente
editpara cumplir con el correcto: formato de código, formato de cotización y formato de texto. Además, adhiérase a las mayúsculas, la gramática y compruebe los errores tipográficos, según las pautas de SO: consulte: Cómo