从numpy datetime64获取年,月或日

我有一个datetime64types的数组:

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

有没有比循环每个元素更好的方法来获得np.array年:

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

我正在使用稳定的numpy版本1.6.2。

由于date时间是不稳定的,我会使用pandas:

 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在内部使用numpydate时间,但是似乎避免了numpy到目前为止的短缺。

我发现以下技巧提供2倍和4倍的速度增加与上述pandas方法(即pd.DatetimeIndex(dates).year 。年等)。 [dt.year for dt in dates.astype(object)][dt.year for dt in dates.astype(object)]我发现与pandas方法类似。 此外,这些技巧可以直接应用于任何形状(二维,三维等)的scheme,

 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 

应该有一个更简单的方法来做到这一点,但根据你想要做什么,最好的路线可能是转换为一个常规的Pythondate时间对象 :

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

根据下面的评论,这似乎只适用于Python 2.7.x而不是Python 3.x

如果你升级到numpy 1.7(其中datetime仍然是实验性的),下面的代码应该可以工作。

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

不幸的是,还没有直接的办法,但有一些间接的方法:

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

要么

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

这两个例子都受到启发。

这两个对我来说在Numpy 1.6.1上工作。 您可能需要对第二个小心一些,因为datetime64的repr()可能在小数点后有小数部分。

使用numpy版本1.10.4和pandas版本0.17.1,

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

我得到你在找什么:

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

另一种可能性是:

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

要么

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

但只适用于标量值,不会采取数组

Anon的回答对我来说很好,但我只需要修改days的陈述

从:

 days = dates - dates.astype('datetime64[M]') + 1 

至:

 days = dates.astype('datetime64[D]') - dates.astype('datetime64[M]') + 1