¿Cómo puedo hacer un número de python de datetime

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.

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 .

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, podría interesarle el paquete scikits.timeseries (que ya no se mantiene) o, mejor aún, 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 …)

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 cambia timearray
  • timearray2 = timearray + np.timedelta64(10,'s') agregará 10 segundos a timearray y convierte el tipo de timearray2 en datetime64[s]