Python 将一个日期框中的日期列值与另一个数据框中的两个日期列按行进行比较

Python 将一个日期框中的日期列值与另一个数据框中的两个日期列按行进行比较,python,pandas,datetime,Python,Pandas,Datetime,我有一个这样的数据框架,有两个日期列和一个质量列: start_date end_date qty 1 2018-01-01 2018-01-08 23 2 2018-01-08 2018-01-15 21 3 2018-01-15 2018-01-22 5 4 2018-01-22 2018-01-29 1

我有一个这样的数据框架,有两个日期列和一个质量列:

     start_date       end_date          qty
1    2018-01-01      2018-01-08         23
2    2018-01-08      2018-01-15         21           
3    2018-01-15      2018-01-22         5
4    2018-01-22      2018-01-29         12
我有第二个数据框,其中只有一列包含几年的年假,如下所示:

         holiday
1       2018-01-01 
2       2018-01-27
3       2018-12-25
4       2018-12-26
  start_date       end_date          qty         holidays
1    2018-01-01      2018-01-08         23       True
2    2018-01-08      2018-01-15         21       False  
3    2018-01-15      2018-01-22         5        False
4    2018-01-22      2018-01-29         12       True
如果第二个数据帧中的日期介于第一个日期帧的日期值之间,我想逐行检查第一个数据帧,并将布尔值指定给新的列。结果如下所示:

         holiday
1       2018-01-01 
2       2018-01-27
3       2018-12-25
4       2018-12-26
  start_date       end_date          qty         holidays
1    2018-01-01      2018-01-08         23       True
2    2018-01-08      2018-01-15         21       False  
3    2018-01-15      2018-01-22         5        False
4    2018-01-22      2018-01-29         12       True
当我尝试使用for循环执行此操作时,会出现以下错误:

ValueError:只能比较标签相同的系列对象

如能提供答案,将不胜感激。

请尝试:

def _is_holiday(row, df2):
    return ((df2['holiday'] >= row['start_date']) & (df2['holiday'] <= row['end_date'])).any()

df1.apply(lambda x: _is_holiday(x, df2), axis=1)
def是假日(世界其他地区,df2):

return((df2['holiday']>=row['start_date'])和(df2['holiday']我不确定您为什么要逐行进行比较。但是布尔比较会快得多

df['holiday'] = ((df2.holiday >= df.start_date) &  (df2.holiday <= df.end_date))
引用hchw解决方案(逐行)


尝试使用列表理解t和np.sum的
IntervalIndex.contains

iix = pd.IntervalIndex.from_arrays(df1.start_date, df1.end_date, closed='both')
df1['holidays'] = np.sum([iix.contains(x) for x in df2.holiday], axis=0) >= 1

Out[812]:
  start_date   end_date  qty  holidays
1 2018-01-01 2018-01-08   23      True
2 2018-01-08 2018-01-15   21     False
3 2018-01-15 2018-01-22    5     False
4 2018-01-22 2018-01-29   12      True

注意:我假设
开始日期
结束日期
假日
列为日期时间格式。如果不是,则需要在运行上述命令之前进行转换,如下所示

df1.start_date = pd.to_datetime(df1.start_date)
df1.end_date = pd.to_datetime(df1.end_date)
df2.holiday = pd.to_datetime(df2.holiday)

如果你想要一个完全矢量化的解决方案,考虑使用下面的代码< NoMPy < /Cord>数组:< /P>

将numpy导入为np
def假日(开始、结束、假日):
开始=开始。重塑(-1,1))
结束=结束。重塑(-1,1))
假日=假日。重塑((1,-1))
结果=np.any(

(开始请共享整个错误消息以及所有相关代码和数据。请参阅:,。可能您不需要循环,您是否阅读了Pandas文档?最后一个元素是否应为false?我之前尝试过,但出现了以下错误:ValueError:只能比较标签相同的系列对象您是否说第一个解决方案无效rk?它应该可以正常工作(只要您将这些列作为适当的日期时间列-如果不使用
pd.to_datetime
并转换它们)。是的,第一个解决方案不起作用,我不知道,因为我对熊猫的了解有限。看看所有的
开始日期
/
结束日期
/
假日
列是否都是日期时间列。我检查过了,它们都是日期时间这是唯一的解决方案,至少可以做点什么。它将所有假日设置为真。是的日期均为datetime64。此解决方案根据您的描述和所需输出,将
df1
的每一行与
df2
的所有行进行检查。因此,如果
df1
中的每一行都包含
df2
中的任何
假日,则所有行都将返回
True
。它在sampl上正常工作e数据,所以我怀疑是这种情况。根据
df2
中的所有
holiday
值,仔细检查
df1
中的每一行。我希望我能给你买一杯啤酒……或20:D
df1.start_date = pd.to_datetime(df1.start_date)
df1.end_date = pd.to_datetime(df1.end_date)
df2.holiday = pd.to_datetime(df2.holiday)
  start_date   end_date  qty  contains_holiday
1 2018-01-01 2018-01-08   23              True
2 2018-01-08 2018-01-15   21             False
3 2018-01-15 2018-01-22    5             False
4 2018-01-22 2018-01-29   12              True