首页 > 解决方案 > 通过从组数据集中旋转数组来计算持续时间

问题描述

我希望你能帮我解决这个问题。我想使用 python 计算持续时间。

数据看起来像这样

group_id, id, departure_time, arrival_time
1,1,61200,61800
1,2,18000,18600
2,1,32400,34200
2,2,64800,66600
2,3,77400,81000

我想得到的结果

group_id,id,departure_time, arrival time, departure_rotate, duration
1,1,61200,61800, 18000, 43800
1,2,18000,18600,61200,43800
2,1,32400,34200,77400,43200
2,2,64800,66600,64800, 1800
2,3,77400,81000,32400,48600

实际上,持续时间 = 到达时间 - 出发时间。但是,应添加减号结果 (24*3600)。提前致谢。到目前为止,我尝试了这个,但没有给出预期的结果。所以我认为我问的方式会有所帮助。

df_duration = pd.DataFrame(df_trips[[
        "group_id", "id", "arrival_time"
    ]], copy = True)
 df_following = pd.DataFrame(df_trips[[
        "group_id", "id", "departure_time"
    ]], copy = True)

    df_following.columns = ["group_id", "id", "following_trip_departure_time"]
    df_following["trip_id"] = df_following["id"] - 1

df_duration = pd.merge(df_duration, df_following, on = ["group_id", "id"])

标签: pythonpandasdataframe

解决方案


假设给定的数据框df为:

# df
   group_id  id  departure_time  arrival_time
0         1   1           61200         61800
1         1   2           18000         18600
2         2   1           32400         34200
3         2   2           64800         66600
4         2   3           77400         81000

要计算departure_rotate,您可以使用对列上df.groupby的数据框进行分组,然后应用于反转给定组的列。dfgroup_idtransformdeparture_timedeparture_time

要计算duration,您可以减去arrival_timeanddeparture_rotate列以得到diff,然后根据大于或不使用np.where将新值分配给列。durationdiff0

利用:

import numpy as np

df['departure_rotate'] = (
    df.groupby('group_id')['departure_time'].transform(lambda s: s[::-1]))

diff = df['arrival_time'].sub(df['departure_rotate'])
df['duration'] = np.where(diff > 0, diff, diff.add(24*3600))

结果:

# print(df)

   group_id  id  departure_time  arrival_time  departure_rotate  duration
0         1   1           61200         61800             18000     43800
1         1   2           18000         18600             61200     43800
2         2   1           32400         34200             77400     43200
3         2   2           64800         66600             64800      1800
4         2   3           77400         81000             32400     48600

推荐阅读