确定假期是否在日期范围内

时间:2018-10-05 16:51:57

标签: pandas

我有以下具有开始和结束日期的数据框,以及定义的假期列表。

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

Holidays = [date(2018,1,1),date(2018,1,15),date(2018,2,19),date(2018,3,9),date(2018,5,28),date(2018,7,4),date(2018,9,3),date(2018,11,22),date(2018,11,23),date(2018,12,24),date(2018,12,25)]

如何确定假日在相应的开始日期和结束日期之间或与结束日期相同的实例?

我对假期是否与开始日期位于同一日期不感兴趣。

结果应如下:

result = pd.DataFrame({'Start': ['2018-01-01 18:47','2018-01-08 06:11','2018-01-12 10:05','2018-02-10 09:22','2018-02-18 14:14','2018-03-08 16:17','2018-03-25 17:35'],
                   'End': ['2018-01-02 17:00','2018-01-08 17:00','2018-01-16 10:05','2018-02-12 17:00','2018-02-19 14:14','2018-03-12 16:17','2018-03-26 17:00'],
                   'InRange': [0,0,1,0,1,1,0]})

1 个答案:

答案 0 :(得分:1)

这是O(n * m)解决方案

l=[any([(z>x)&(z<y) for z in Holidays]) for x , y in zip(df.Start.dt.date,df.End.dt.date)]
#[any((z>x)&(z<y) for z in Holidays) for x , y in zip(df.Start.dt.date,df.End.dt.date)]
l
Out[1089]: [False, False, True, False, False, True, False]


#df['InRange']=l
#df['InRange']=df['InRange'].astype(int)