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

时间:2019-02-17 23:26:27

标签: 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'],
              '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)]

我能够找到一种方法来确定“假日”是否在日期时间范围内,但无法获得实际计数。

是否可以更改下面的代码以收集计数而不是布尔值?

这是我到目前为止尝试过的:

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)]

我要寻找的结果如下:

result = 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'],
                   'Holidays': [2,1,0,1,1,0,3]})

1 个答案:

答案 0 :(得分:1)

我们可以创建一个函数来检查这种情况,然后apply逐行检查。

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

您所需的输出不正确,因为Holidays列表中的任何日期时间戳都没有小时。为了获得您发布的输出,我们必须四舍五入到一天。

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