我有两个具有相同列名的数据框,需要同时遍历两个数据框,以查看是否存在任何重叠以及是否存在日期重叠,如果是,请更新数据框的其中一列,与内部循环相关联。
我目前能够确定是否存在重叠,但无法更新该值并获取ValueError。
cmdb type begin end duration
xyz Planned Outage 2019-03-31 09:45:00 2019-03-31 11:27:00 12291
xyz Planned Outage 2019-04-20 07:25:00 2019-04-22 10:50:00 185100
cmdb type begin end duration
xyz Outage 2019-04-30 15:20:00 2019-05-01 00:17:00 32279
xyz Outage 2019-04-20 21:42:00 2019-04-20 21:43:00 60
我尝试使用itertuples,iterrows等都无济于事。
from datetime import datetime
from collections import namedtuple
Range = namedtuple('Range', ['begin', 'end'])
for item in apr19_copy.itertuples():
r1 = Range(begin = item.begin, end = item.end)
for item_outage in apr19.itertuples():
r2 = Range(begin = item_outage.begin, end = item_outage.end)
latest_start = max(r1.begin, r2.begin)
earliest_end = min(r1.end, r2.end)
if(latest_start > earliest_end):
continue
diff = (earliest_end - latest_start).seconds + 1
overlap = max(0, diff)
print(item_outage.duration)
apr19.set_value(item_outage.index, 'duration', item_outage.duration
- overlap)
运行以上代码段后,我希望apr19数据帧第二行中的持续时间设置为0。结果数据帧应如下所示(请注意*期望值附近)
cmdb type begin end duration
xyz Outage 2019-04-30 15:20:00 2019-05-01 00:17:00 32279
xyz Outage 2019-04-20 21:42:00 2019-04-20 21:43:00 *0*
但是我得到
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
答案 0 :(得分:0)
该错误是由item_outage.index
引起的。它是从itertuples
获得的,而index
表示其上的方法。要获取该行的索引,必须使用Index
。所以你应该使用:
apr19.set_value(item_outage.Index, 'duration', item_outage.duration
- overlap)
但是我的熊猫版本给我使用set_value
的弃用警告,所以恕我直言,这应该更好(如果您的熊猫版本接受):
apr19.at[item_outage.Index, 'duration'] = item_outage.duration - overlap
可以,但是值不是预期的0,而是-1 ...