J'ai des données d'entrée, avec des horodatages dans le fichier d'entrée sous forme d'heures à partir de la date et l'heure spécifiées dans le nom de fichier.
C'est un peu inutile, donc je dois le convertir en objets python datetime.datetime, puis le mettre dans un tableau numpy. Je pourrais écrire une boucle for, mais j'aimerais faire quelque chose comme:
numpy.arange(datetime.datetime(2000, 1,1), datetime.datetime(2000, 1,2), datetime.timedelta(hours=1))
qui lance une TypeError.
Cela peut-il être fait? Je suis coincé avec python 2.6 et numpy 1.6.1.
Voir NumPy Datetimes and Timedeltas . Fondamentalement, vous pouvez représenter les heures dans NumPy en utilisant le numpy.datetime64
type, qui vous permet de faire des plages de valeurs.
Pour NumPy 1.6, qui a un _ beaucoup moins utile datetime64
type, vous pouvez utiliser une compréhension de liste appropriée pour construire les datetimes (voir aussi Création d'une plage de dates en Python ):
base = datetime.datetime(2000, 1, 1)
arr = numpy.array([base + datetime.timedelta(hours=i) for i in xrange(24)])
Cela produit
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)
Le point clé ici est d'utiliser astype(datetime)
, sinon le résultat sera datetime64
.
Avec NumPy moderne, vous pouvez le faire:
np.arange(np.datetime64('2017-01-01'), np.datetime64('2017-01-08'))
Et cela vous donne:
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]')
Notez que la solution @nneonneo peut être simplifiée dans
result = first_date + np.arange(24) * datetime.timedelta(hours=1)
grâce aux manipulations du tableau NumPy. Le tableau result
a alors un dtype=object
.
Pour les gammes plus complexes, vous pourriez être intéressé par les scikits.timeseries
package (n'est plus maintenu) ou mieux, le package pandas
qui a réimplémenté la plupart des idées de scikits.timeseries
. Les deux packages prennent en charge les anciennes versions de NumPy (1.5, 1.6 ...)
Comme indiqué dans une autre réponse, pour Numpy> 1.7, vous pouvez utiliser la capacité de datetime intégrée de Numpy. Les exemples de la documentation Numpy n'incluent pas l'utilisation de np.arange
Avec des étapes, alors en voici un:
timearray = np.arange('2000-01-01', '2000-01-02',np.timedelta64(1,'h'), dtype='datetime64')
Numpy définit le dtype de ce résultat sur datetime64[h]
. Vous pouvez définir cela explicitement sur une unité de temps plus petite avec dtype='datetime64[m]'
.
Dans la version 1.8.1 (et je m'y attendais plus tôt), essayer d'ajouter un décalage à ce tableau de résultats inférieur à une heure n'aura aucun effet.
timearray += np.timedelta64(10,'s')
ne change pas timearray
timearray2 = timearray + np.timedelta64(10,'s')
ajoutera 10 secondes à timearray
et convertira le type de timearray2
en datetime64[s]