2012-08-27 6 views
12

Tengo algunos datos de entrada, con marcas de tiempo en el archivo de entrada en forma de horas a partir de la fecha especificada en el nombre del archivo.¿Cómo puedo hacer un python nude un rango de fecha y hora

Esto es un poco inútil, así que tengo que convertirlo en python datetime.datetime objects, y luego ponerlo en una matriz numpy. Podría escribir un bucle, pero me gustaría hacer algo como:

numpy.arange(datetime.datetime(2000, 1,1), datetime.datetime(2000, 1,2), datetime.timedelta(hours=1)) 

que arroja un TypeError.

¿Se puede hacer esto? Estoy atrapado con Python 2.6 y numpy 1.6.1.

+0

Ver también http://stackoverflow.com/questions/993358/creating-a-range-of-dates-in-python – nneonneo

Respuesta

8

Ver NumPy Datetimes and Timedeltas. Básicamente, puede representar las fechas en NumPy usando el tipo numpy.datetime64, que le permite hacer rangos de valores.

Para NumPy 1.6, que tiene un mucho menos útil de tipo datetime64, puede utilizar una lista por comprensión adecuados para construir los datetimes (véase también Creating a range of dates in 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) 
+0

Si tuviera numpy 1.7, esta sería la respuesta. Pero parece que tengo 1.6.1, así que el ejemplo no funciona. – Melanie

+0

Se agregó un método que funciona con 1.6. – nneonneo

+0

Y también es compatible con la fecha y hora que necesito para la salida. ¡Gracias! – Melanie

5

Tenga en cuenta que la solución de @neneneo se puede simplificar en

result = first_date + np.arange(24) * datetime.timedelta(hours=1) 

gracias a las manipulaciones de la matriz NumPy. La matriz result tiene un dtype=object.

Para intervalos más complejas, que podría estar interesado en el paquete scikits.timeseries (ya no se mantiene) o mejor, la pandas paquete que reimplementada la mayor parte de las ideas de scikits.timeseries. Ambos paquetes soportan las versiones anteriores de NumPy (1.5, 1.6 ...)

+0

Gracias - parece que debería haber estado usando pandas para toda la tarea. La próxima vez :-) – Melanie

13
t = np.arange(datetime(1985,7,1), datetime(2015,7,1), timedelta(days=1)).astype(datetime) 

El punto clave aquí es utilizar astype(datetime), de lo contrario el resultado será datetime64.

+0

Esto es mucho más agradable – josh

3

Como se indicó en otra respuesta, para Numpy> 1.7, puede usar la capacidad de fecha y hora incorporada de Numpy. Los ejemplos en la documentación Numpy no incluyen el uso de np.arange con escalones, así que aquí está uno:

timearray = np.arange('2000-01-01', '2000-01-02',np.timedelta64(1,'h'), dtype='datetime64')

Numpy establece el dtype de este resultado a 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 lo espero antes), intentar agregar un desplazamiento a esa matriz de resultados que sea menor 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 para timearray y convierte la dtype de timearray2 a datetime64[s]
3

Con NumPy moderna se puede 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]') 
Cuestiones relacionadas