¿Cómo puedo hacer un número de python de datetime
np datetime64 python (5)
Tengo algunos datos de entrada, con marcas de tiempo en el archivo de entrada en forma de horas a partir de la fecha y hora especificadas en el nombre de archivo.
Esto es un poco inútil, por lo que necesito convertirlo en objetos datetime.datetime de python y luego colocarlo en una matriz numpy. Podría escribir un bucle for, pero me gustaría hacer algo como:
numpy.arange(datetime.datetime(2000, 1,1), datetime.datetime(2000, 1,2), datetime.timedelta(hours=1))
que lanza un TypeError.
Se puede hacer esto? Estoy atascado con Python 2.6 y numpy 1.6.1.
Como se señaló en otra respuesta, para Numpy> 1.7, puede usar la capacidad de fecha y hora incorporada de Numpy. Los ejemplos en la documentación de Numpy no incluyen el uso de np.arange
con los pasos, así que aquí hay uno:
timearray = np.arange(''2000-01-01'', ''2000-01-02'',np.timedelta64(1,''h''), dtype=''datetime64'')
Numpy establece el tipo de dtype de este resultado en datetime64[h]
. Puede establecer esto explícitamente en una unidad de tiempo más pequeña con dtype=''datetime64[m]''
.
En la versión 1.8.1 (y espero que antes), intentar agregar un desplazamiento a la matriz de resultados que es más pequeña que una hora no tendrá ningún efecto.
-
timearray += np.timedelta64(10,''s'')
no cambiatimearray
-
timearray2 = timearray + np.timedelta64(10,''s'')
agregará 10 segundos atimearray
y convierte el tipo detimearray2
endatetime64[s]
Con el moderno NumPy puedes hacer esto:
np.arange(np.datetime64(''2017-01-01''), np.datetime64(''2017-01-08''))
Y te da:
array([''2017-01-01'', ''2017-01-02'', ''2017-01-03'', ''2017-01-04'',
''2017-01-05'', ''2017-01-06'', ''2017-01-07''], dtype=''datetime64[D]'')
Tenga en cuenta que la solución @nneonneo se puede simplificar en
result = first_date + np.arange(24) * datetime.timedelta(hours=1)
Gracias a las manipulaciones de matriz NumPy. La matriz de result
tiene entonces un dtype=object
.
Para rangos más complejos, es posible que le interese el paquete scikits.timeseries
(que ya no se mantiene) o mejor, el paquete pandas
que reimplementó la mayoría de las ideas de scikits.timeseries
. Ambos paquetes admiten versiones anteriores de NumPy (1.5, 1.6 ...)
Ver NumPy Datetimes y Timedeltas . Básicamente, puede representar tiempos de datos en NumPy usando el tipo numpy.datetime64
, que le permite hacer rangos de valores.
Para NumPy 1.6, que tiene un tipo datetime64
mucho menos útil, puede usar una lista de comprensión adecuada para construir los tiempos de datos (vea también Crear un rango de fechas en Python ):
base = datetime.datetime(2000, 1, 1)
arr = numpy.array([base + datetime.timedelta(hours=i) for i in xrange(24)])
Esto produce
array([2000-01-01 00:00:00, 2000-01-01 01:00:00, 2000-01-01 02:00:00,
2000-01-01 03:00:00, 2000-01-01 04:00:00, 2000-01-01 05:00:00,
2000-01-01 06:00:00, 2000-01-01 07:00:00, 2000-01-01 08:00:00,
2000-01-01 09:00:00, 2000-01-01 10:00:00, 2000-01-01 11:00:00,
2000-01-01 12:00:00, 2000-01-01 13:00:00, 2000-01-01 14:00:00,
2000-01-01 15:00:00, 2000-01-01 16:00:00, 2000-01-01 17:00:00,
2000-01-01 18:00:00, 2000-01-01 19:00:00, 2000-01-01 20:00:00,
2000-01-01 21:00:00, 2000-01-01 22:00:00, 2000-01-01 23:00:00], dtype=object)
from datetime import datetime, timedelta
t = np.arange(datetime(1985,7,1), datetime(2015,7,1), timedelta(days=1)).astype(datetime)
El punto clave aquí es usar astype(datetime)
, de lo contrario, el resultado será datetime64
.