按日期时间在列级别的熊猫分组

问题描述 投票:0回答:1

我有一个由以下人员创建的数据框:

df = pd.DataFrame({})
df['Date']  = pd.to_datetime(np.arange(0,12), unit='h', origin='2018-08-01  06:00:00')
df['ship'] = [1,1,2,2,2,3,3,3,3,3,3,3] # ship ID number
dt_trip = 4 # maximum duration of each trip to be classified as the same trip


                  Date  ship
0  2018-08-01 06:00:00     1
1  2018-08-01 07:00:00     1
2  2018-08-01 08:00:00     2
3  2018-08-01 09:00:00     2
4  2018-08-01 10:00:00     2
5  2018-08-01 11:00:00     3
6  2018-08-01 12:00:00     3
7  2018-08-01 13:00:00     3
8  2018-08-01 14:00:00     3
9  2018-08-01 15:00:00     3
10 2018-08-01 16:00:00     3
11 2018-08-01 17:00:00     3

我尝试获得一个新列,该列显示每艘船的行程。相对于行程开始,每次行程定义为4个小时的间隔。当新的船号在下一行时,将自动开始新的行程(与先前的日期时间无关)。从以前的帖子中,我得到了旅行的解决方案。

origin = df["Date"][0].hour
df["Trip"] = df.apply(lambda x: ((x["Date"].hour - origin) // dt_trip) + 1, axis=1)
df["Trip"] = df.groupby(['Trip','ship']).ngroup() +1 # trip starts at: 1

当船柱改变其行时,此解决方案将进行新的旅行。我唯一想做的就是将新旅程开始时的原点更改为日期时间。因此索引4应该具有Trip = 2,因为船是相同的,并且行程开始之间的时间差为(index = 2)。现在,它查看第一个给定的日期时间。

所需的解决方案如下:

                  Date  ship  Trip  Trip_desired
0  2018-08-01 06:00:00     1     1  1
1  2018-08-01 07:00:00     1     1  1
2  2018-08-01 08:00:00     2     2  2
3  2018-08-01 09:00:00     2     2  2
4  2018-08-01 10:00:00     2     3  2
5  2018-08-01 11:00:00     3     4  3
6  2018-08-01 12:00:00     3     4  3
7  2018-08-01 13:00:00     3     4  3
8  2018-08-01 14:00:00     3     5  3
9  2018-08-01 15:00:00     3     5  4
10 2018-08-01 16:00:00     3     5  4
11 2018-08-01 17:00:00     3     5  4
pandas pandas-groupby python-datetime
1个回答
0
投票

我愿意:

total_time = df['Date'] - df.groupby('ship')['Date'].transform('min')
trips = total_time.dt.total_seconds().fillna(0)//(dt_trip*3600)

df['trip'] = df.groupby(['ship', trips]).ngroup()+1

输出:

                  Date  ship  trip
0  2018-08-01 06:00:00     1     1
1  2018-08-01 07:00:00     1     1
2  2018-08-01 08:00:00     2     2
3  2018-08-01 09:00:00     2     2
4  2018-08-01 10:00:00     2     2
5  2018-08-01 11:00:00     3     3
6  2018-08-01 12:00:00     3     3
7  2018-08-01 13:00:00     3     3
8  2018-08-01 14:00:00     3     3
9  2018-08-01 15:00:00     3     4
10 2018-08-01 16:00:00     3     4
11 2018-08-01 17:00:00     3     4
© www.soinside.com 2019 - 2024. All rights reserved.