首页 > 解决方案 > 无法比较不同的日子

问题描述

我的代码如下所示:

import pandas as pd 
from datetime import datetime, timedelta

df = pd.DataFrame ({
    'User':['Mcafee','John','Albert'],
    'LastOnline':['4/1/2020  1:41:17', '3/5/2020  09:1:23', '1/1/2020  06:51:1'],
    'Status':["NaN","NaN","NaN"]
    })

df['LastOnline'] = pd.to_datetime(df['LastOnline'],format='%m/%d/%Y %H:%M:%S')
date = '04/03/2020'
datetime_object = datetime.strptime(date, '%m/%d/%Y')

diff = datetime_object - df['LastOnline']
seven_days  = timedelta(days=7)
thirty_days = timedelta(days=30)

if diff <= seven_days:
    df['Status'] = "7 days ago"
elif (diff > seven_days) & (diff <= thirty_days):
    df['Status'] = "30 days ago"
else:
    df['Status'] = "disable it"

print(df)

初始df是:

     User          LastOnline Status
0  Mcafee 2020-04-01 01:41:17    NaN
1    John 2020-03-05 09:01:23    NaN
2  Albert 2020-01-01 06:51:01    NaN

我想要实现的是基于一个简单的逻辑来改变状态列。如果df['LastOnline']在 7 天内,则将df['Status']更改为 7 天,依此类推,如上述 if 语句中所述。这是正确的输出。

     User          LastOnline Status
0  Mcafee 2020-04-01 01:41:17    7 days ago
1    John 2020-03-05 09:01:23    30 days ago
2  Albert 2020-01-01 06:51:01    disable it

但我得到这个错误:

  File ".\test.py", line 21, in <module>
    if diff <= seven_days:
  File "C:\Users\\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pandas\core\generic.py", line 1555, in __nonzero__
    self.__class__.__name__
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

什么比较不起作用?谢谢!

标签: python-3.xpandas

解决方案


在与现有系列 ( )取得差异后,您可以避免循环并使用np.selectwith :series.dt.daysdatetime_object'LastOnline'

days_diff = (datetime_object - df['LastOnline']).dt.days
#define the conditions
c1,c2 = days_diff.le(7) , days_diff.gt(7) & days_diff.le(30)

df['Status'] = np.select([c1,c2],['7 days ago','30 days ago'],'disable it')
print(df)

     User          LastOnline       Status
0  Mcafee 2020-04-01 01:41:17   7 days ago
1    John 2020-03-05 09:01:23  30 days ago
2  Albert 2020-01-01 06:51:01   disable it

推荐阅读