2012-11-23 78 views
5

我想創建NumPy datetime64對象的矢量,這些矢量是從一年,幾個月和幾天的一維矢量創建的,並且也是相反的方向,即提取年,幾個月,或從日期date64矢量的天。我正在使用NumPy 1.7.0b2。使用NumPy創建矢量化的年/月/日操作datetime64

例如,假設

years = [1990, 1992, 1995, 1994] 
months = [1, 6, 3, 7] 
days = [3, 20, 14, 27] 

現在我想創建使用這些年,月和日長4的np.datetime64載體。沒有使用Python循環的方法嗎?

另一方面,假設dates是數據類型爲np.datetime64的向量,頻率爲每天。然後,我會能夠像x.DAYS()這樣的東西,並得到一個向量[3, 20, 14, 27]

回答

0

我不知道的方式做到這一點沒有某種形式的循環,但我有一個列表理解內聯有點:

years = [1990, 1992, 1995, 1994] 
months = [1, 6, 3, 7] 
days = [3, 20, 14, 27] 
np.array(['{0[0]}-{0[1]}-{0[2]}'.format(x) for x in zip(years, months, days)], dtype='datetime64') 

再回到另一條路,你必須每次轉換項目到一個正規的datetime。您可以通過調用astype(object)來完成此操作,該操作適用於整個數組或單個對象。你做的哪一個可能取決於你如何使用數據。

2
import numpy as np 
def combine64(years, months=1, days=1, weeks=None, hours=None, minutes=None, 
       seconds=None, milliseconds=None, microseconds=None, nanoseconds=None): 
    years = np.asarray(years) - 1970 
    months = np.asarray(months) - 1 
    days = np.asarray(days) - 1 
    types = ('<M8[Y]', '<m8[M]', '<m8[D]', '<m8[W]', '<m8[h]', 
      '<m8[m]', '<m8[s]', '<m8[ms]', '<m8[us]', '<m8[ns]') 
    vals = (years, months, days, weeks, hours, minutes, seconds, 
      milliseconds, microseconds, nanoseconds) 
    return sum(np.asarray(v, dtype=t) for t, v in zip(types, vals) 
       if v is not None) 

years = [1990, 1992, 1995, 1994] 
months = [1, 6, 3, 7] 
days = [3, 20, 14, 27] 

print(combine64(years, months, days)) 

產生

array(['1990-01-03', '1992-06-20', '1995-03-14', '1994-07-27'], dtype='datetime64[D]')