web-dev-qa-db-fra.com

Comment puis-je faire un python numpy arange de datetime

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.

22
Melanie

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)
14
nneonneo
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.

22
Arc Shinus

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]')
11
John Zwinck

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 ...)

8
Pierre GM

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]
7
Thav