【问题标题】:Calculating time range with timedelta & Boolean使用 timedelta 和 Boolean 计算时间范围
【发布时间】: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


    【解决方案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
    

    【讨论】:

    • 谢谢,杰兹瑞尔!这很有用,但它没有在新列“经验”中提供正确的数据。不确定这是否是我正在做的事情,但我必须从 actn_dt 回顾一年。如果 actn_dt 至少是一年或更早,则经历过。我尝试将 + 更改为 - 仍然给我错误的信息。
    • 我编辑答案,希望对您有所帮助。如果没有,您可以添加问题推荐输出 - 最好是 Minimal, Complete, and Verifiable example
    • 我提供了一个预期输出的例子。我想我写错了 365 天,但我不确定如何写 365 天或更大。或者一年以上。谢谢。
    • 嗯,我认为您必须将 &gt;= 更改为 &lt;=。但是在你想要的输出中,值Experienced2015-11-01 是错字。
    • 您可以使用带括号和&amp;的两个条件,例如:df.loc[(df['a'] &lt;= 1) &amp; ( df['b'] &gt; -10), 'new'] = 'between -10 and 1'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多