Conversión entre fecha y hora, marca de tiempo y fecha y hora64

Resuelto Andy Hayden asked hace 12 años • 14 respuestas

¿ Cómo convierto un numpy.datetime64objeto en datetime.datetime(o Timestamp)?

En el siguiente código, creo objetos de fecha y hora, marca de tiempo y fecha y hora64.

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 a partir 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 largo (!) ( 1025222400000000000L)...

Andy Hayden avatar Dec 04 '12 20:12 Andy Hayden
Aceptado

Puedes usar el constructor pd.Timestamp. El siguiente diagrama puede ser útil para esta y otras preguntas relacionadas.

Conversiones entre representaciones de tiempo

Quant avatar Feb 20 '2014 18:02 Quant

Bienvenido al infierno.

Puedes simplemente pasar un objeto datetime64 a pandas.Timestamp:

In [16]: Timestamp(numpy.datetime64('2012-05-01T01:00:00.000000'))
Out[16]: <Timestamp: 2012-05-01 01:00:00>

Sin embargo, noté que esto no funciona bien en NumPy 1.6.1:

numpy.datetime64('2012-05-01T01:00:00.000000+0100')

Además, pandas.to_datetimese puede usar (esto no está en la versión de desarrollo, no he verificado v0.9.1):

In [24]: pandas.to_datetime('2012-05-01T01:00:00.000000+0100')
Out[24]: datetime.datetime(2012, 5, 1, 1, 0, tzinfo=tzoffset(None, 3600))
Wes McKinney avatar Dec 06 '2012 22:12 Wes McKinney

Para convertir numpy.datetime64a datetimeun objeto que represente la hora en UTC en numpy-1.8:

>>> from datetime import datetime
>>> import numpy as np
>>> dt = datetime.utcnow()
>>> dt
datetime.datetime(2012, 12, 4, 19, 51, 25, 362455)
>>> dt64 = np.datetime64(dt)
>>> ts = (dt64 - np.datetime64('1970-01-01T00:00:00Z')) / np.timedelta64(1, 's')
>>> ts
1354650685.3624549
>>> datetime.utcfromtimestamp(ts)
datetime.datetime(2012, 12, 4, 19, 51, 25, 362455)
>>> np.__version__
'1.8.0.dev-7b75899'

El ejemplo anterior supone que un datetimeobjeto ingenuo se interpreta np.datetime64como hora en UTC.


Para convertir datetimehacia np.datetime64y hacia atrás ( numpy-1.6):

>>> np.datetime64(datetime.utcnow()).astype(datetime)
datetime.datetime(2012, 12, 4, 13, 34, 52, 827542)

Funciona tanto en un solo np.datetime64objeto como en una gran variedad de archivos np.datetime64.

Piense de np.datetime64la 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, datetimey los objetos numpy correspondientes.

Su "ejemplo desagradable" funciona correctamente:

>>> from datetime import datetime
>>> import numpy 
>>> numpy.datetime64('2002-06-28T01:00:00.000000000+0100').astype(datetime)
datetime.datetime(2002, 6, 28, 0, 0)
>>> numpy.__version__
'1.6.2' # current version available via pip install numpy

Puedo reproducir el longvalor numpy-1.8.0instalado como:

pip install git+https://github.com/numpy/numpy.git#egg=numpy-dev

El mismo ejemplo:

>>> from datetime import datetime
>>> import numpy
>>> numpy.datetime64('2002-06-28T01:00:00.000000000+0100').astype(datetime)
1025222400000000000L
>>> numpy.__version__
'1.8.0.dev-7b75899'

Devuelve longporque numpy.datetime64el tipo for .astype(datetime)es equivalente a .astype(object)eso devuelve el entero de Python ( long) en numpy-1.8.

Para obtener datetimeel objeto podrías:

>>> dt64.dtype
dtype('<M8[ns]')
>>> ns = 1e-9 # number of seconds in a nanosecond
>>> datetime.utcfromtimestamp(dt64.astype(int) * ns)
datetime.datetime(2002, 6, 28, 0, 0)

Para obtener datetime64eso usa segundos directamente:

>>> dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100', 's')
>>> dt64.dtype
dtype('<M8[s]')
>>> datetime.utcfromtimestamp(dt64.astype(int))
datetime.datetime(2002, 6, 28, 0, 0)

Los documentos de numpy dicen que la API de fecha y hora es experimental y puede cambiar en futuras versiones de numpy.

jfs avatar Dec 04 '2012 13:12 jfs