web-dev-qa-db-fra.com

Obtenir l'année, le mois ou le jour de numpy datetime64

J'ai un tableau de type datetime64:

dates = np.datetime64(['2010-10-17', '2011-05-13', "2012-01-15"])

Existe-t-il un meilleur moyen que de parcourir chaque élément pour obtenir np.array of years:

years = f(dates)
#output:
array([2010, 2011, 2012], dtype=int8) #or dtype = string

J'utilise stable numpy version 1.6.2.

43
enedene

Comme datetime n’est pas stable numpy, j’utiliserais les pandas pour cela:

In [52]: import pandas as pd

In [53]: dates = pd.DatetimeIndex(['2010-10-17', '2011-05-13', "2012-01-15"])

In [54]: dates.year
Out[54]: array([2010, 2011, 2012], dtype=int32)

Pandas utilise numpy datetime en interne, mais semble éviter les pénuries que numpy a jusqu’à présent.

31
bmu

Je trouve que les astuces suivantes donnent une augmentation de vitesse entre 2x et 4x par rapport à la méthode des pandas décrite ci-dessus (c'est-à-dire pd.DatetimeIndex(dates).year etc.). La vitesse de [dt.year for dt in dates.astype(object)] est similaire à la méthode des pandas. Ces astuces peuvent également être appliquées directement à ndarrays de n'importe quelle forme (2D, 3D, etc.).

dates = np.arange(np.datetime64('2000-01-01'), np.datetime64('2010-01-01'))
years = dates.astype('datetime64[Y]').astype(int) + 1970
months = dates.astype('datetime64[M]').astype(int) % 12 + 1
days = dates - dates.astype('datetime64[M]') + 1
19
Anon

Il devrait y avoir un moyen plus simple de le faire, mais, en fonction de ce que vous essayez de faire, le meilleur chemin peut être de convertir en un objet Python datetime régulier :

datetime64Obj = np.datetime64('2002-07-04T02:55:41-0700')
print datetime64Obj.astype(object).year
# 2002
print datetime64Obj.astype(object).day
# 4

D'après les commentaires ci-dessous, cela ne semble fonctionner que dans Python 2.7.x et non pas Python 3.x.

5
Nick

Si vous effectuez une mise à niveau vers numpy 1.7 (où datetime est toujours désigné comme expérimental), les opérations suivantes devraient fonctionner.

dates/np.timedelta64(1,'Y')
1
Daniel

En utilisant numpy version 1.10.4 et pandas version 0.17.1,

dates = np.array(['2010-10-17', '2011-05-13', '2012-01-15'], dtype=np.datetime64)
pd.to_datetime(dates).year

Je comprends ce que vous cherchez:

array([2010, 2011, 2012], dtype=int32)
1
Steve Schulist

Une autre possibilité est:

np.datetime64(dates,'Y') - returns - numpy.datetime64('2010')

ou

np.datetime64(dates,'Y').astype(int)+1970 - returns - 2010

mais ne fonctionne que sur les valeurs scalaires, ne prend pas de tableau

0
Mark Sojka

Malheureusement, il n'y a pas encore de moyen direct de le faire, mais il existe deux moyens indirects:

[dt.year for dt in dates.astype(object)]

ou

[datetime.datetime.strptime(repr(d), "%Y-%m-%d %H:%M:%S").year for d in dates]

tous deux inspirés par les exemples ici .

Les deux fonctionnent pour moi sur Numpy 1.6.1. Vous devrez peut-être être un peu plus prudent avec le second, car le repr () de datetime64 pourrait avoir une partie de fraction après un point décimal.

0
acjay