2012-08-27 14 views
12

Ho alcuni dati di input, con data e ora nel file di input sotto forma di ore dalla data specificata nel nome del file.Come posso fare un python numpy arange di datetime

Questo è un po 'inutile, quindi ho bisogno di convertirlo in oggetti python datetime.datetime, e quindi metterlo in una matrice numpy. Potrei scrivere un ciclo for, ma mi piacerebbe fare qualcosa di simile:

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

che getta una TypeError.

Questo può essere fatto? Sono bloccato con Python 2.6 e Numpy 1.6.1.

+0

Vedere anche http://stackoverflow.com/questions/993358/creating-a-range-d-in-python – nneonneo

risposta

8

Vedere NumPy Datetimes and Timedeltas. In sostanza, è possibile rappresentare i dati in NumPy utilizzando il tipo numpy.datetime64, che consente di eseguire intervalli di valori.

Per NumPy 1.6, che ha una molto meno utile datetime64 tipo, è possibile utilizzare un elenco adatto di comprensione per costruire le datetimes (vedi anche 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)]) 

Questo 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

Se solo avessi numpy 1.7, questa sarebbe la risposta. Ma sembra che io abbia 1.6.1, quindi l'esempio non funziona. – Melanie

+0

Aggiunto un metodo che funziona con 1.6. – nneonneo

+0

Ed è anche compatibile con il datetime che ho bisogno di produrre. Grazie! – Melanie

5

Si noti che la soluzione di @nneonneo può essere semplificata in

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

grazie alle manipolazioni della matrice NumPy. L'array result ha quindi un valore dtype=object.

Per gli intervalli più complesse, potreste essere interessati nel pacchetto scikits.timeseries (non più mantenuti) o, meglio, il pacchetto pandas che reimplementata maggior parte delle idee di scikits.timeseries. Entrambi i pacchetti supportano le versioni più vecchie di NumPy (1.5, 1.6 ...)

+0

Grazie - sembra che avrei dovuto usare i panda per l'intera operazione. La prossima volta :-) – Melanie

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

Il punto chiave qui è quello di utilizzare astype(datetime), altrimenti il ​​risultato sarà datetime64.

+0

Questo è molto più bello – josh

3

Come indicato in un'altra risposta, per Numpy> 1.7, è possibile utilizzare la funzionalità datetime integrata di Numpy. Gli esempi nella documentazione Numpy non includono l'utilizzo di np.arange con gradini, quindi ecco uno:

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

Numpy imposta la DTYPE di questo risultato a datetime64[h]. È possibile impostarlo esplicitamente su un'unità di tempo più piccola con dtype='datetime64[m]'.

Nella versione 1.8.1 (e mi aspetto in precedenza), provare ad aggiungere un offset a quell'array di risultati inferiore a un'ora non avrà alcun effetto.

  • timearray += np.timedelta64(10,'s') non cambia timearray
  • timearray2 = timearray + np.timedelta64(10,'s') aggiungerà 10 secondi per timearray e converte il DTYPE di timearray2 per datetime64[s]
3

Con NumPy moderna si può fare questo:

np.arange(np.datetime64('2017-01-01'), np.datetime64('2017-01-08')) 

E ti dà:

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]') 
Problemi correlati