Pandas 熊猫的两个日期时间之间是否有一个特定的日期和月份?

Pandas 熊猫的两个日期时间之间是否有一个特定的日期和月份?,pandas,time,Pandas,Time,我有一个数据帧,其中每一行代表一段时间。有一个start\u date列,其中包含时段开始的日期时间;还有一个end\u date列,其中包含时段结束的日期时间 通常,我将通过筛选开始和结束日期相对于其他日期的行来查询此数据集。例如,如果我想筛选句点包含特定日期的所有行,我将执行以下操作: df = df[(df['start_date' < my_date]) & ('end_date' > my_date)] 我想你是在寻找一个没有提及任何年份的日期是否在特定时间之间。

我有一个数据帧,其中每一行代表一段时间。有一个
start\u date
列,其中包含时段开始的日期时间;还有一个
end\u date
列,其中包含时段结束的日期时间

通常,我将通过筛选开始和结束日期相对于其他日期的行来查询此数据集。例如,如果我想筛选句点包含特定日期的所有行,我将执行以下操作:

df = df[(df['start_date' < my_date]) & ('end_date' > my_date)]

我想你是在寻找一个没有提及任何年份的日期是否在特定时间之间。您可以创建一个区间指数,然后检查年份是否介于两者之间,即()

输出:

print(df.reset_index(drop=True))
开始日期结束日期包含4月6日新 0 2012-07-10 23:06:07 2014-12-30 15:07:09正确 1 2011-10-2113:56:202011-10-2512:54:26假 2 2011-04-23 03:25:00 2013-12-10 23:08:02正确 3 2014-08-10 01:14:03 2016-01-23 22:23:52正确 4 2017-04-23 17:15:43 2017-06-03 14:02:19假假 5 2012-10-01 01:42:00 2016-02-05 04:17:16正确 6 2015-08-21 19:59:45 2015-09-06 03:58:59假假 7 2016-06-10 23:03:14 2016-10-26 23:00:53假假 8 2011-08-12 20:50:34 2013-09-22 23:03:05正确 9 2012-11-04 00:45:24 2013-08-15 02:39:36正确 我会选择@jezreal的解决方案。在这里,我使用了apply,随着数据帧长度的增加,apply非常耗时

我认为您需要使用
列表理解创建的所有掩码:

#get minimal and max years
stacked = df[['start_date','end_date']].stack()
min_date = stacked.min().year
max_date = stacked.max().year
print (min_date)
print (max_date)
2010
2017

#for each date create mask
masks = [(df['start_date'] < pd.Timestamp(x,4,6)) & 
         (df['end_date'] > pd.Timestamp(x,4,6)) for x in range(min_date, max_date + 1)]

#reduce all masks with OR
df['new'] = np.logical_or.reduce(masks)

现在我明白了这个问题。您想检查时间间隔中是否存在一个月和特定的一天?我说得对吗?是的。如果你想要一个激励性的例子,考虑“这段时间包括圣诞节吗?”或者“这个间隔包括财政年度的开始吗?”听起来真的很有趣,让我尽可能多地尝试一下你在这个例子中测试的每一个间隔都包括一个4月6日。它们都包括2016年4月6日。我很感激在我的原始问题中没有提供测试用例(我现在正在整理一些,并将编辑原始问题以包含它们),但我认为这种方法是无法挽救的。这与我在问题末尾提出的解决方案相同,但这是一种非常简洁的方法,我没有意识到。我会让这个问题运行几天,看看我神秘的更优雅的解决方案是否出现,但如果没有,我会将此标记为接受的答案。我认为我的解决方案,我为此工作了2个小时;)哦,对我来说已经一个小时了。当你沉迷于解决一个问题的时候,时间过得真快。你的解决方案真是太快了。我用它该死的慢。非常简洁的回答!:)先生,谢谢你,但这部分是对的。我们只需要日期,而不需要像4月6日或12月25日这样的年份。有什么想法吗?先生,我已经更新了解决方案,你有什么建议吗?我现在得离开办公室,大约一个小时后回来…;-)
print(df.reset_index(drop=True))
start_date end_date contains_april_6th new 0 2012-07-10 23:06:07 2014-12-30 15:07:09 True True 1 2011-10-21 13:56:20 2011-10-25 12:54:26 False False 2 2011-04-23 03:25:00 2013-12-10 23:08:02 True True 3 2014-08-10 01:14:03 2016-01-23 22:23:52 True True 4 2017-04-23 17:15:43 2017-06-03 14:02:19 False False 5 2012-10-01 01:42:00 2016-02-05 04:17:16 True True 6 2015-08-21 19:59:45 2015-09-06 03:58:59 False False 7 2016-06-10 23:03:14 2016-10-26 23:00:53 False False 8 2011-08-12 20:50:34 2013-09-22 23:03:05 True True 9 2012-11-04 00:45:24 2013-08-15 02:39:36 True True
#get minimal and max years
stacked = df[['start_date','end_date']].stack()
min_date = stacked.min().year
max_date = stacked.max().year
print (min_date)
print (max_date)
2010
2017

#for each date create mask
masks = [(df['start_date'] < pd.Timestamp(x,4,6)) & 
         (df['end_date'] > pd.Timestamp(x,4,6)) for x in range(min_date, max_date + 1)]

#reduce all masks with OR
df['new'] = np.logical_or.reduce(masks)
print (df)
            start_date            end_date  contains_april_6th    new
0  2012-07-10 23:06:07 2014-12-30 15:07:09                True   True
1  2011-10-21 13:56:20 2011-10-25 12:54:26               False  False
2  2011-04-23 03:25:00 2013-12-10 23:08:02                True   True
3  2014-08-10 01:14:03 2016-01-23 22:23:52                True   True
4  2017-04-23 17:15:43 2017-06-03 14:02:19               False  False
5  2012-10-01 01:42:00 2016-02-05 04:17:16                True   True
6  2015-08-21 19:59:45 2015-09-06 03:58:59               False  False
7  2016-06-10 23:03:14 2016-10-26 23:00:53               False  False
8  2011-08-12 20:50:34 2013-09-22 23:03:05                True   True
9  2012-11-04 00:45:24 2013-08-15 02:39:36                True   True
10 2016-03-28 07:51:55 2017-10-07 13:07:57                True   True
11 2010-08-03 06:42:04 2012-01-04 09:04:00                True   True
12 2010-05-11 01:22:27 2012-12-30 05:51:48                True   True
13 2011-12-30 01:19:28 2014-06-20 09:13:32                True   True
14 2011-11-12 18:04:15 2013-01-05 19:47:20                True   True
15 2014-04-13 10:40:25 2015-06-08 11:00:44                True   True
16 2012-10-23 05:43:02 2014-11-04 11:53:35                True   True
17 2011-03-18 05:00:50 2012-07-30 17:24:36                True   True
18 2010-04-24 10:00:09 2011-02-21 23:26:50               False  False
19 2012-02-09 08:05:07 2016-04-06 14:24:22                True   True
20 2012-04-05 08:39:50 2014-03-11 01:22:43                True   True
21 2011-07-30 19:19:32 2017-02-14 17:04:36                True   True
22 2010-01-02 23:48:45 2012-12-16 14:42:24                True   True
23 2011-11-08 23:49:27 2012-03-11 22:17:14               False  False
24 2013-02-25 02:27:50 2014-08-02 00:09:07                True   True
25 2010-07-11 18:56:22 2014-09-06 20:38:50                True   True
26 2012-11-23 02:08:11 2013-02-26 18:51:47               False  False
27 2011-05-31 09:02:02 2017-08-01 01:58:09                True   True