2016-02-11 46 views
0

我需要幫助執行timedelta函數以確定actn_dt是否大於或等於1年前,如果是,則返回經驗值。使用timedelta和布爾值計算時間範圍

數據幀f2看起來是這樣的:

  nm_emp_lst actn_dt 
14483 MACKENZIE   2015-03-22 
132902 CAMPBELL   2015-04-19 
124182 SJOSTROM   2015-03-22 
103482 LAPLANTE   2014-11-30 
45722 LEMAY    2014-11-30 
169088 TAYLOR   2015-06-14 
105355 HENDERSON   2015-11-01 
105359 HENDERSON   2014-10-19 
45394 PELLERIN   2015-07-12 
119317 BOISSEAU   2015-07-12 

應該是這樣的:

  nm_emp_lst actn_dt  Experienced 
14483 MACKENZIE   2015-03-22 
132902 CAMPBELL   2015-04-19  
124182 SJOSTROM   2015-03-22 
103482 LAPLANTE   2014-11-30 Experienced 
45722 LEMAY    2014-11-30 Experienced 
169088 TAYLOR   2015-06-14  
105355 HENDERSON   2015-11-01  
105359 HENDERSON   2014-10-19 Experienced 
45394 PELLERIN   2015-07-12  
119317 BOISSEAU   2015-07-12 

那麼,什麼是等於或高於一年前更大。

做了一個功能:

year = timedelta(days=365) 
today2 = datetime.datetime.strftime(datetime.datetime.now(),'%A_%B_%d_%Y_%H%M') 

def year(row): 
    if row['actn_dt'] >= today2 - year: 
     return "Experienced" 

然後lamdba功能:

f2['Experienced'] = f2.apply (lambda row: year (row),axis=1)  

由此,我收到錯誤:

TypeError: ("unsupported operand type(s) for -: 'str' and 'function'", u'occurred at index 14483')

我dtypes是:

nm_emp_lst   object 
actn_dt  datetime64[ns] 

感謝任何幫助!

===更新===
在jezrael的幫助下,我能夠想出一個解決方案。它可能是漫長的,但它的工作。首先,我必須創建一個新的專欄,在今天的日期之前提供一年的數據。

f2['year1'] = datetime.datetime.now().date() - datetime.timedelta(days=365) 

然後,我不得不從timedelta的 'YEAR1' 更改爲datetime:

f2['year1'] = pd.to_datetime(f2['year1'], coerce=True) 

在這裏,我使用jezrael提供的編碼。

f2.loc[f2['actn_dt'] <= f2['year1'], 'Experienced'] = "Experienced" 

新的結果是:

   nm_emp_lst actn_dt  year1 Experienced 
14483 MACKENZIE   2015-03-22 2015-02-12   NaN 
132902 CAMPBELL   2015-04-19 2015-02-12   NaN 
124182 SJOSTROM   2015-03-22 2015-02-12   NaN 
103482 LAPLANTE   2014-11-30 2015-02-12 Experienced 
45722 LEMAY    2014-11-30 2015-02-12 Experienced 
169088 TAYLOR   2015-06-14 2015-02-12   NaN 
105355 HENDERSON   2015-11-01 2015-02-12   NaN 
105359 HENDERSON   2014-10-19 2015-02-12 Experienced 
45394 PELLERIN   2015-07-12 2015-02-12   NaN 
119317 BOISSEAU   2015-07-12 2015-02-12   NaN 

這工作就像一個魅力!謝謝jezrael!

回答

1

您可以使用loc - 在df第二排被改變來進行測試:

print df 
     nm_emp_lst actn_dt 
14483 MACKENZIE 2015-03-22 
132902 CAMPBELL 2018-04-19 
124182 SJOSTROM 2015-03-22 
103482 LAPLANTE 2014-11-30 
45722  LEMAY 2014-11-30 
169088  TAYLOR 2015-06-14 
105355 HENDERSON 2015-11-01 
105359 HENDERSON 2014-10-19 
45394 PELLERIN 2015-07-12 

print datetime.timedelta(days=365) 
365 days, 0:00:00 

print datetime.datetime.now().date() 
2016-02-12 

print datetime.datetime.now().date() - datetime.timedelta(days=365) 
2015-02-12 
print df['actn_dt'] <= datetime.datetime.now().date() - datetime.timedelta(days=365) 
14483  False 
132902 False 
124182 False 
103482  True 
45722  True 
169088 False 
105355 False 
105359  True 
45394  False 
119317 False 
Name: actn_dt, dtype: bool 

df.loc[df['actn_dt'] <= datetime.datetime.now().date() - datetime.timedelta(days=365) , 'Experienced'] = "Experienced" 
print df 
     nm_emp_lst actn_dt Experienced 
14483 MACKENZIE 2015-03-22   NaN 
132902 CAMPBELL 2015-04-19   NaN 
124182 SJOSTROM 2015-03-22   NaN 
103482 LAPLANTE 2014-11-30 Experienced 
45722  LEMAY 2014-11-30 Experienced 
169088  TAYLOR 2015-06-14   NaN 
105355 HENDERSON 2015-11-01   NaN 
105359 HENDERSON 2014-10-19 Experienced 
45394 PELLERIN 2015-07-12   NaN 
119317 BOISSEAU 2015-07-12   NaN 
+0

謝謝,jezrael!這很有用,但它沒有在「經驗豐富」的新專欄中提供正確的數據。不知道我在這方面做了些什麼,但是我必須從actn_dt回顧一年。如果actn_dt至少是一年或更久以前,那麼經驗豐富。我試圖改變+來 - 並仍然給我錯誤的信息。 – david

+0

我編輯答案,我希望它可以幫助你。如果沒有,你可以添加到問題的建議輸出 - 最好的是[最小,完整和可驗證的例子](http://stackoverflow.com/help/mcve) – jezrael

+0

我提供了一個預期輸出的例子。我想我錯誤地寫了365天,但我不知道如何365和更高。或者一年或更長時間。謝謝。 – david