INSERTTIME 0 2021-06-18 00:00:00 WPP 571 >td style="text-align:left;align:left;">2021-06-24 09:26:350 nan 2021-06-18 00:00:00 1 2021-06-18 08:00:00 WPP 571 PP Belawan 0 >di laut>0 6-24 09:26:35 1 1 2021-06-18 00:00:00 2 2021-06-18 16:00:00 0 0 2021-06-18 16:00:00 3 2021-06-19 00:00:00 >WPP 571PP Belawan 4 09:26:35 1 1 2021-06-18 16:00:00 4 2021-06-19 08:00:00 WPP 571 >td style="text-align:left;">di lautPP Belawan 0 >2021-0 6-24 09:26:35南style="text align:right;">0 2021-06-19 08:00:00
我使用Pandas Python来计算行之间的时间增量,当它使用前一行或下一行时,时间增量是基于条件的。
我的桌子是这样的样品台
我想创建具有以下条件的时间增量列:当STATUS>状态_之前并且当STATUS<status_after。
我尝试了几种方法来做到这一点,但最终大多出现了这个错误:
The truth value of a Series is ambiguous. Use a.empty, a.bool(),a.item(), a.any() or a.all().
这是我所做的一个例子:
if db.STATUS == 0 and db.status_before == 1:
db.delta = db['REPORTDATE'].shift()
有什么解决方案吗?
- 要获得更高质量的答案,请始终以文本而非图像的形式提供样本数据
np.where()
允许在赋值中使用条件逻辑- 您的逻辑没有指定在不满足条件时要使用的值,所以我使用了REPORTDATE
import numpy as np
df = pd.DataFrame({"REPORTDATE":pd.date_range("2021-06-18", freq="8h", periods=5), "NAMA":["WPP 571"]*5,
"PELABUHAN":(["PP Belawan","di laut"]*3)[1:6], "STATUS":([1,0]*3)[0:5],
"ASAL":(["PP Belawan","di laut"]*3)[0:5], "IGNORED":[0]*5,
"INSERTTIME":[pd.to_datetime("2021-06-24 09:26:35")]*5})
(
df.assign(
status_after=df["STATUS"].shift(-1), status_before=df["STATUS"].shift()
).assign(
timedelta=lambda d: np.where(
(d.STATUS == 0) & (d["status_before"] == 1),
d["REPORTDATE"].shift(),
d["REPORTDATE"],
)
)
)