基于datetim的多部分逻辑检查添加列

2024-05-23 17:54:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个如下所示的数据帧:

Num         First_Date      Last_Date
20008526    7/3/2013 0:00   7/18/2013 0:00
20008526    7/3/2013 0:00   7/18/2013 0:00
20008526    7/3/2013 0:00   7/18/2013 0:00
20008526    7/3/2013 0:00   7/18/2013 0:00
20008526    7/3/2013 0:00   7/18/2013 0:00
20008526    7/3/2013 0:00   7/18/2013 0:00
20008526    7/3/2013 0:00   7/18/2013 0:00
20008526    7/3/2013 0:00   7/18/2013 0:00
20008526    7/3/2013 0:00   7/18/2013 0:00
20008526    7/3/2013 0:00   7/18/2013 0:00
20008526    7/3/2013 0:00   7/18/2013 0:00
20008526    7/3/2013 0:00   7/18/2013 0:00
20008526    7/3/2013 0:00   7/18/2013 0:00
20008534    3/25/2014 0:00  5/5/2014 0:00
20008534    3/25/2014 0:00  5/5/2014 0:00
20008534    3/25/2014 0:00  5/5/2014 0:00
20008534    3/25/2014 0:00  5/5/2014 0:00
20008534    3/25/2014 0:00  5/5/2014 0:00
20008534    3/25/2014 0:00  5/5/2014 0:00
20008534    3/25/2014 0:00  5/5/2014 0:00
20008534    3/25/2014 0:00  5/5/2014 0:00
20008534    3/25/2014 0:00  5/5/2014 0:00
20008534    3/25/2014 0:00  5/5/2014 0:00
20008534    3/25/2014 0:00  5/5/2014 0:00
20008534    3/25/2014 0:00  5/5/2014 0:00
20008534    3/25/2014 0:00  5/5/2014 0:00
20008636    7/15/2015 0:00  8/18/2015 0:00
20008636    7/15/2015 0:00  8/18/2015 0:00
20008636    7/15/2015 0:00  8/18/2015 0:00

基本上,我想看看这两个日期是否都在我指定的时间段内

period_beg = datetime.datetime(2015, 7, 1, 0, 0)
period_end = datetime.datetime(2015, 9, 30, 0, 0)

这就是我要去的地方,但这看起来很疯狂和复杂。。。哦,它不起作用了!哈哈

df['TimeCheck'] = df[(df['First_Date'] >= period_beg) and (df['Last_Date'] <= period_end)]

以下是我希望获得的:

Num         First_Date      Last_Date       TimeCheck
20008526    7/3/2013 0:00   7/18/2013 0:00  TRUE
20008526    7/3/2013 0:00   7/18/2013 0:00  TRUE
20008526    7/3/2013 0:00   7/18/2013 0:00  TRUE
20008526    7/3/2013 0:00   7/18/2013 0:00  TRUE
20008526    7/3/2013 0:00   7/18/2013 0:00  TRUE
20008526    7/3/2013 0:00   7/18/2013 0:00  TRUE
20008526    7/3/2013 0:00   7/18/2013 0:00  TRUE
20008526    7/3/2013 0:00   7/18/2013 0:00  TRUE
20008526    7/3/2013 0:00   7/18/2013 0:00  TRUE
20008526    7/3/2013 0:00   7/18/2013 0:00  TRUE
20008526    7/3/2013 0:00   7/18/2013 0:00  TRUE
20008526    7/3/2013 0:00   7/18/2013 0:00  TRUE
20008526    7/3/2013 0:00   7/18/2013 0:00  TRUE
20008534    3/25/2014 0:00  5/5/2014 0:00   FALSE
20008534    3/25/2014 0:00  5/5/2014 0:00   FALSE
20008534    3/25/2014 0:00  5/5/2014 0:00   FALSE
20008534    3/25/2014 0:00  5/5/2014 0:00   FALSE
20008534    3/25/2014 0:00  5/5/2014 0:00   FALSE
20008534    3/25/2014 0:00  5/5/2014 0:00   FALSE
20008534    3/25/2014 0:00  5/5/2014 0:00   FALSE
20008534    3/25/2014 0:00  5/5/2014 0:00   FALSE
20008534    3/25/2014 0:00  5/5/2014 0:00   FALSE
20008534    3/25/2014 0:00  5/5/2014 0:00   FALSE
20008534    3/25/2014 0:00  5/5/2014 0:00   FALSE
20008534    3/25/2014 0:00  5/5/2014 0:00   FALSE
20008534    3/25/2014 0:00  5/5/2014 0:00   FALSE
20008636    7/15/2015 0:00  8/18/2015 0:00  TRUE
20008636    7/15/2015 0:00  8/18/2015 0:00  TRUE
20008636    7/15/2015 0:00  8/18/2015 0:00  TRUE

那么,如何做到这一点呢?还有-我应该这样做(我不知道它的术语)还是应该迭代行并逐个添加值


Tags: 数据falsetruedfdatetimedate地方num
1条回答
网友
1楼 · 发布于 2024-05-23 17:54:37

您需要使用按位&而不是and

In [7]:
period_beg = dt.datetime(2015, 7, 1, 0, 0)
period_end = dt.datetime(2015, 9, 30, 0, 0)
df['TimeCheck'] = (df['First_Date'] >= period_beg) & (df['Last_Date'] <= period_end)
df

Out[7]:
         Num First_Date  Last_Date TimeCheck
0   20008526 2013-07-03 2013-07-18     False
1   20008526 2013-07-03 2013-07-18     False
2   20008526 2013-07-03 2013-07-18     False
3   20008526 2013-07-03 2013-07-18     False
4   20008526 2013-07-03 2013-07-18     False
5   20008526 2013-07-03 2013-07-18     False
6   20008526 2013-07-03 2013-07-18     False
7   20008526 2013-07-03 2013-07-18     False
8   20008526 2013-07-03 2013-07-18     False
9   20008526 2013-07-03 2013-07-18     False
10  20008526 2013-07-03 2013-07-18     False
11  20008526 2013-07-03 2013-07-18     False
12  20008526 2013-07-03 2013-07-18     False
13  20008534 2014-03-25 2014-05-05     False
14  20008534 2014-03-25 2014-05-05     False
15  20008534 2014-03-25 2014-05-05     False
16  20008534 2014-03-25 2014-05-05     False
17  20008534 2014-03-25 2014-05-05     False
18  20008534 2014-03-25 2014-05-05     False
19  20008534 2014-03-25 2014-05-05     False
20  20008534 2014-03-25 2014-05-05     False
21  20008534 2014-03-25 2014-05-05     False
22  20008534 2014-03-25 2014-05-05     False
23  20008534 2014-03-25 2014-05-05     False
24  20008534 2014-03-25 2014-05-05     False
25  20008534 2014-03-25 2014-05-05     False
26  20008636 2015-07-15 2015-08-18      True
27  20008636 2015-07-15 2015-08-18      True
28  20008636 2015-07-15 2015-08-18      True

这是因为您正在比较数组,而不是and不理解的标量值

您还尝试使用条件中的布尔掩码来索引df,方法如下:

df['TimeCheck'] = df[(df['First_Date'] >= period_beg) and (df['Last_Date'] <= period_end)]

因为and生成了ValueError

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

即使您将上述中的and更改为&,这也只会分配True值:

In [10]:
df['TimeCheck'] = df[(df['First_Date'] >= period_beg) & (df['Last_Date'] <= period_end)]
df

Out[10]:
         Num First_Date  Last_Date    TimeCheck
0   20008526 2013-07-03 2013-07-18          NaN
1   20008526 2013-07-03 2013-07-18          NaN
2   20008526 2013-07-03 2013-07-18          NaN
3   20008526 2013-07-03 2013-07-18          NaN
4   20008526 2013-07-03 2013-07-18          NaN
5   20008526 2013-07-03 2013-07-18          NaN
6   20008526 2013-07-03 2013-07-18          NaN
7   20008526 2013-07-03 2013-07-18          NaN
8   20008526 2013-07-03 2013-07-18          NaN
9   20008526 2013-07-03 2013-07-18          NaN
10  20008526 2013-07-03 2013-07-18          NaN
11  20008526 2013-07-03 2013-07-18          NaN
12  20008526 2013-07-03 2013-07-18          NaN
13  20008534 2014-03-25 2014-05-05          NaN
14  20008534 2014-03-25 2014-05-05          NaN
15  20008534 2014-03-25 2014-05-05          NaN
16  20008534 2014-03-25 2014-05-05          NaN
17  20008534 2014-03-25 2014-05-05          NaN
18  20008534 2014-03-25 2014-05-05          NaN
19  20008534 2014-03-25 2014-05-05          NaN
20  20008534 2014-03-25 2014-05-05          NaN
21  20008534 2014-03-25 2014-05-05          NaN
22  20008534 2014-03-25 2014-05-05          NaN
23  20008534 2014-03-25 2014-05-05          NaN
24  20008534 2014-03-25 2014-05-05          NaN
25  20008534 2014-03-25 2014-05-05          NaN
26  20008636 2015-07-15 2015-08-18  2.00086e+07
27  20008636 2015-07-15 2015-08-18  2.00086e+07
28  20008636 2015-07-15 2015-08-18  2.00086e+07

这不是你想要的

另外,只有最后3行符合您的条件,不确定为什么您希望最后日期值为7/18/2013 0:00的行也为True

相关问题 更多 >