¿Cómo convierto un numpy.datetime64
objeto 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 datetime
o Timestamp
de 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
,pandas
las 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
" yTimestamp
es unadatetime
(una subclase de) de todos modos :)Respuestas:
Para convertir
numpy.datetime64
a objeto datetime que represente la hora en UTC ennumpy-1.8
:El ejemplo anterior supone que un objeto datetime ingenuo se interpreta
np.datetime64
como 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
long
valor ennumpy-1.8.0
instalado como:El mismo ejemplo:
Devuelve
long
porque fornumpy.datetime64
type.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.datetime64
ydt64.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_datetime
convierte todo apd.Timestamp
. Unpd.Timestamp
objeto tiene el métodoto_pydatetime
para volver a undatetime.datetime
objeto y unto_datetime64
mé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_datetime
se puede usar (esto está fuera de la versión de desarrollo, no he comprobado v0.9.1)fuente
issubclass(pd.Timestamp, datetime)
esTrue
. Y laTimestamp
clase 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.Timestamp
opd.to_datetime
.pd.to_datetime
funciona 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
, eltolist
devuelve una lista dedatetime
objetos. Para un solodatetime64
objeto, devuelve un solodatetime
objeto.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,D
producedatetime.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
dt
porque 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
numpy
ydatetime
no 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.datetime
objeto si el originaldatetime64
está en unidades de microsegundos, mientras que otras unidades devuelven una marca de tiempo entera. Uso el móduloxarray
para E / S de datos de archivos Netcdf que usadatetime64
unidades 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
datetime64
valor 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
edit
para 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