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