gpt4 book ai didi

python - 考虑重叠情况下确定总时间的有效方法

转载 作者:太空宇宙 更新时间:2023-11-03 14:54:34 24 4
gpt4 key购买 nike

我使用 pandas 数据框进行以下操作:

我正在尝试找到最佳方法来确定船舶在特定泊位所花费的总时间,同时考虑到访问持续时间的重叠。数据如下:

 IN                    OUT                        BERTH 
2015-01-14 13:57:00 2015-01-15 17:15:00 01
2015-01-14 14:30:00 2015-01-15 02:50:00 01
2015-01-14 14:30:00 2015-01-16 06:10:00 01
2015-01-25 02:15:00 2015-01-26 13:41:00 01

我真正想要的是找出特定泊位的使用总时间。因此,查看数据有重叠,所以我不能简单地添加每个记录的时间。

查看上面的数据,我们可以看到第二艘船的时间完全在第一艘船内,因此记录的时间将为 0,并且第三艘船在第一艘船之前到达,但一直停留到第一艘船离开之后,所以这里时间将为 =(第 3 艘船 - 第 1 艘船),然后我们将移动到下一艘,因为那里没有重叠,只需将 [4 艘船中 - 4 艘船中] 添加到泊位 1 上花费的总时间,并继续此操作直到最后生成如下所示的内容:

BERTH   HOURS WORKED
01 7.750
02 10.275
03 5.585
08 31.980

最佳答案

这是一个泊位的解决方案。我希望你们可以将其扩展到多个泊位。

将数据框拆分为到达和出发:

dfIN = df[['IN']]
dfOUT = df[['OUT']]
dfIN['direction'] = 1
dfOUT['diretcion'] = -1

到目前为止,IN 和 OUT 只是时间戳:

dfIN.columns = ('TS', 'direction')
dfOUT.columns = ('TS', 'direction')

将这两部分组合成一个高排序的流量数据帧:

traffic = pd.concat([dfIN, dfOUT]).sort_values('TS')
# TS direction
#0 2015-01-14 13:57:00 1
#1 2015-01-14 14:30:00 1
#2 2015-01-14 14:30:00 1
#1 2015-01-15 02:50:00 -1
#0 2015-01-15 17:15:00 -1
#2 2015-01-16 06:10:00 -1
#3 2015-01-25 02:15:00 1
#3 2015-01-26 13:41:00 -1

计算到达和离开泊位的船舶数量:

traffic['ships'] = traffic['direction'].cumsum()

确定泊位空置的时间段。然后计算每个“繁忙期”的序号。

traffic['empty'] = (traffic['ships'] == 0).shift().fillna(0).astype(int)
traffic['busy_id'] = traffic['empty'].cumsum()
# TS direction ships empty busy_id
#0 2015-01-14 13:57:00 1 1 0 0
#1 2015-01-14 14:30:00 1 2 0 0
#2 2015-01-14 14:30:00 1 3 0 0
#1 2015-01-15 02:50:00 -1 2 0 0
#0 2015-01-15 17:15:00 -1 1 0 0
#2 2015-01-16 06:10:00 -1 0 0 0
#3 2015-01-25 02:15:00 1 1 1 1
#3 2015-01-26 13:41:00 -1 0 0 1

计算每个“繁忙期”的开始和结束:

busy_data = traffic.groupby('busy_id')['TS'].agg([min, max])
# min max
#busy_id
#0 2015-01-14 13:57:00 2015-01-16 06:10:00
#1 2015-01-25 02:15:00 2015-01-26 13:41:00

计算所有“繁忙期”的总长度:

(busy_data['max'] - busy_data['min']).sum()
#Timedelta('3 days 03:39:00')

关于python - 考虑重叠情况下确定总时间的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45681654/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com