【发布时间】:2016-02-11 18:31:04
【问题描述】:
我需要帮助执行 timedelta 函数来确定 actn_dt 是否大于或等于 1 年前,如果是,请返回经验。
数据框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')
我的数据类型是:
nm_emp_lst object
actn_dt datetime64[ns]
感谢任何帮助!
=== 更新 ===
在 jezrael 的帮助下,我想出了一个解决方案。这可能是一段很长的路,但它确实有效。首先,我必须创建一个新列来提供今天之前一年的数据。
f2['year1'] = datetime.datetime.now().date() - datetime.timedelta(days=365)
然后我不得不将“year1”从 timedelta 更改为 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
这就像一个魅力!谢谢耶斯瑞尔!
【问题讨论】:
标签: python numpy pandas dataframe timedelta