Python 将列表中的日期与数据框中的日期范围进行比较

Python 将列表中的日期与数据框中的日期范围进行比较,python,pandas,date,datetime,Python,Pandas,Date,Datetime,我很难找到一种方法来计算数据帧中日期时间范围之间假日的出现次数。假日在列表中,日期时间范围在数据框中,如下所示:注意,这是一个非常大的数据集的子集 df = pd.DataFrame({'Date': ['2018-12-19 18:47','2019-01-01 06:11','2019-01-12 10:05','2019-02-17 14:22','2019-03-08 16:17','2019-03-25 17:35','2019-02-14 17:35'],

我很难找到一种方法来计算数据帧中日期时间范围之间假日的出现次数。假日在列表中,日期时间范围在数据框中,如下所示:注意,这是一个非常大的数据集的子集

df = pd.DataFrame({'Date': ['2018-12-19 18:47','2019-01-01 06:11','2019-01-12 10:05','2019-02-17 14:22','2019-03-08 16:17','2019-03-25 17:35','2019-02-14 17:35'],
              'End Date': ['2018-12-28 18:47','2019-01-05 06:11','2019-01-16 10:05','2019-02-19 14:22','2019-03-12 16:17','2019-03-26 17:35','2019-05-27 17:35']})

df['Date'] = pd.to_datetime(df['Date'])
df['End Date'] = pd.to_datetime(df['End Date'])

Holidays = [date(2018,12,24),date(2018,12,25),date(2019,1,1),date(2019,1,21),date(2019,2,18),date(2019,3,8),date(2019,5,27)]
我已经找到了一种方法来确定假期是否在datetime范围内,但无法得到实际的计数

有没有办法改变下面的代码来收集计数而不是布尔值

这就是我迄今为止所尝试的:

df['Holidays'] = [any([(z>=x)&(z<=y) for z in Holidays]) for x , y in zip(df['Date'].dt.date,df['End Date'].dt.date)]

我们可以创建一个函数来检查这个条件,然后按行应用它

def fn(series):
    return sum([series.iloc[0] <= h <= series.iloc[1] for h in Holidays])

df.assign(Holidays=df.apply(fn, axis=1))

                 Date            End Date  Holidays
0 2018-12-19 18:47:00 2018-12-28 18:47:00         2
1 2019-01-01 06:11:00 2019-01-05 06:11:00         0
2 2019-01-12 10:05:00 2019-01-16 10:05:00         0
3 2019-02-17 14:22:00 2019-02-19 14:22:00         1
4 2019-03-08 16:17:00 2019-03-12 16:17:00         0
5 2019-03-25 17:35:00 2019-03-26 17:35:00         0
6 2019-02-14 17:35:00 2019-05-27 17:35:00         3

您想要的输出是不正确的,因为假期列表没有小时,但您忽略了这一点,只是按天检查
def fn(series):
    return sum([series.iloc[0] <= h <= series.iloc[1] for h in Holidays])

df.assign(Holidays=df.apply(fn, axis=1))

                 Date            End Date  Holidays
0 2018-12-19 18:47:00 2018-12-28 18:47:00         2
1 2019-01-01 06:11:00 2019-01-05 06:11:00         0
2 2019-01-12 10:05:00 2019-01-16 10:05:00         0
3 2019-02-17 14:22:00 2019-02-19 14:22:00         1
4 2019-03-08 16:17:00 2019-03-12 16:17:00         0
5 2019-03-25 17:35:00 2019-03-26 17:35:00         0
6 2019-02-14 17:35:00 2019-05-27 17:35:00         3
def fn(series):
    return sum([series.iloc[0].floor('d') <= h <= series.iloc[1].floor('d') for h in Holidays])

df.assign(Holidays=df.apply(fn, axis=1))

               Date          End Date  Holidays
0  2018-12-19 18:47  2018-12-28 18:47         2
1  2019-01-01 06:11  2019-01-05 06:11         1
2  2019-01-12 10:05  2019-01-16 10:05         0
3  2019-02-17 14:22  2019-02-19 14:22         1
4  2019-03-08 16:17  2019-03-12 16:17         1
5  2019-03-25 17:35  2019-03-26 17:35         0
6  2019-02-14 17:35  2019-05-27 17:35         3