2016-11-22 52 views
3

考慮以下numpy的數組:產生-1周圍numpy的給定日期/1天

import numpy as np 
t = np.array(['2016-07-28', '2016-08-25', '2016-09-29', '2016-10-27', '2016-11-17'], dtype='datetime64[D]') 

怎樣才能前一天和第二天每個數組元素?我所需的輸出是如下:

array(['2016-07-27', '2016-07-28', '2016-07-29', ..., '2016-11-16', 
    '2016-11-17', '2016-11-18'], dtype='datetime64[D]') 

我目前的方法是,分別生成三個數組(以前,日,NEXT)和除以下將它們合併:

tt = np.sort(np.append(t1,(t,t2))) 
+0

你可以分享如何創建't1'和't2' -1/+ 1日期? – burhan

+0

t2 =(t + pd.Timedelta(days = 1))。astype('datetime64 [D]'); t1 =(t - pd.Timedelta(days = 1))。astype('datetime64 [D]')。 T創建的是pd.Series對象,但我最終將其作爲一個numpy數組存儲。希望這是有道理的。 –

回答

6

Broadcast這裏呢!

(t[:,None] + np.arange(-1,2)).ravel() 

緊湊版本 -

(t[:,None] + [-1,0,1]).ravel() 

採樣運行 -

In [191]: t 
Out[191]: array(['2016-07-28', '2016-08-25', '2016-09-29', '2016-10-27', '2016-11-17'], dtype='datetime64[D]') 

In [192]: (t[:,None] + np.arange(-1,2)).ravel() 
Out[192]: 
array(['2016-07-27', '2016-07-28', '2016-07-29', '2016-08-24', 
     '2016-08-25', '2016-08-26', '2016-09-28', '2016-09-29', 
     '2016-09-30', '2016-10-26', '2016-10-27', '2016-10-28', 
     '2016-11-16', '2016-11-17', '2016-11-18'], dtype='datetime64[D]') 

In [193]: (t[:,None] + [-1,0,1]).ravel() 
Out[193]: 
array(['2016-07-27', '2016-07-28', '2016-07-29', '2016-08-24', 
     '2016-08-25', '2016-08-26', '2016-09-28', '2016-09-29', 
     '2016-09-30', '2016-10-26', '2016-10-27', '2016-10-28', 
     '2016-11-16', '2016-11-17', '2016-11-18'], dtype='datetime64[D]') 
+0

非常好的解決方案。比我的好得多:-) – NinjaGaiden

+0

偉大的解決方案(一如既往!)。謝謝。 –

2

這個怎麼樣?

def f(d): 
    return (d-np.timedelta64(1,'D'),d,d+np.timedelta64(1,'D')) 

import numpy as np 
t = np.array(['2016-07-28', '2016-08-25', '2016-09-29', '2016-10-27', '2016-11-17'], dtype='datetime64[D]') 
print np.asarray(map(f,t)) 
+0

這也行得通,但我想,@Divakars的解決方案更有效率。謝謝 –

+0

毫無疑問。我甚至不知道你可以做到這一點。 – NinjaGaiden