Pandas按日期时间分组

3
我有一个长得像这样的Pandas数据框:
df = pd.DataFrame({})
df['Date']  = pd.to_datetime(np.arange(0,11), unit='h', origin='2018-08-01 00:00:00')

                 Date
0 2018-08-01 00:00:00
1 2018-08-01 01:00:00
2 2018-08-01 02:00:00
3 2018-08-01 03:00:00
4 2018-08-01 04:00:00
5 2018-08-01 05:00:00
6 2018-08-01 06:00:00
7 2018-08-01 07:00:00
8 2018-08-01 08:00:00
9 2018-08-01 09:00:00
10 2018-08-01 10:00:00

我想要创建一个新的列'Trip',它是一个整数,告诉我这是第几次旅行。在旅行开始的4小时内的所有记录都应该属于同一次旅行。结果应如下所示:
                 Date   Trip
0 2018-08-01 00:00:00   1
1 2018-08-01 01:00:00   1
2 2018-08-01 02:00:00   1
3 2018-08-01 03:00:00   1
4 2018-08-01 04:00:00   1
5 2018-08-01 05:00:00   2
6 2018-08-01 06:00:00   2
7 2018-08-01 07:00:00   2
8 2018-08-01 08:00:00   2
9 2018-08-01 09:00:00   2
10 2018-08-01 10:00:00  3

你知道如何做到这一点吗?

2个回答

1
您可以像这样使用lambda:

df["Trip"] = df.apply(lambda x: (x["Date"].hour // 5) + 1, axis=1)

您想要覆盖的时间为5小时

+1在这里是因为您想从第一次旅行开始

如果起始时间不是00:00:00

origin = df["Date"][0].hour
df["Trip"] = df.apply(lambda x: ((x["Date"].hour - origin) // 5) + 1, axis=1)

其他获取方法:

df["Trip"] = df.apply(lambda x: ((x["Date"].hour - origin) // 4.0) + 1, axis=1)

不要忘记在需要时转换为 int

1
解决方案应该从第一个索引的开始计算。如果起始时间是“2018-08-01 03:00:00”,则不起作用,因为直到索引8,它应该被视为1次行程(所有行程都在5小时内)。 - Jeroen
1
如果您将此应用于 `df = pd.DataFrame({'year': [2018, 2018,2018,2018,2018], 'month': [1, 1,1,1,1], 'day': [5, 5,5,5,5], 'hour': [1, 2,5,9,10],
'minute': [0, 15,30,40,50]}) df['Date'] = pd.to_datetime(df,format='%Y%m%d %H:%m')`,它会显示行程为1、1、3、5、5,而不是1、1、2、3、3。
- Jeroen
1
完成这个操作之后,我可以执行:df['Trip'] = df.groupby('Trip').ngroup() +1,然后我将检查它是否在所有情况下都有效。 - Jeroen
1
谢谢,它现在可以工作了。您知道如何在索引级别内执行 df["Trip"] = df.apply(lambda x: ((x["Date"].hour - origin) // 4.0) + 1, axis=1) 操作吗?例如,对所有不同的索引执行此操作? - Jeroen
我的意思是,首先在所有trip==1的行上使用您的解决方案,然后在所有trip==2上使用您的解决方案,最后在trip==3上使用您的解决方案。 - Jeroen
显示剩余5条评论

1

给你。享受吧!

import pandas as pd
import numpy as np

df = pd.DataFrame({})
df['Date']  = pd.to_datetime(np.arange(0,11), unit='h', origin='2018-08-01 00:00:00')

def get_cum_time(x):

    diff_time = x.Date - x.prev_date

    return diff_time / np.timedelta64(1, 'h')

df['prev_date'] = df.Date.shift(1)

df['diff_time'] = df.apply(get_cum_time, axis=1)
df['cum_time'] = df.diff_time.cumsum()

df.cum_time.fillna(1.0, inplace=True)

def get_trip(x):
    return x // 4 + 1

df['Trip'] = df.cum_time.apply(get_trip)

print(df)

输出:

                      Date           prev_date  diff_time  cum_time  Trip
0  2018-08-01 00:00:00                 NaT        NaN       1.0   1.0
1  2018-08-01 01:00:00 2018-08-01 00:00:00        1.0       1.0   1.0
2  2018-08-01 02:00:00 2018-08-01 01:00:00        1.0       2.0   1.0
3  2018-08-01 03:00:00 2018-08-01 02:00:00        1.0       3.0   1.0
4  2018-08-01 04:00:00 2018-08-01 03:00:00        1.0       4.0   2.0
5  2018-08-01 05:00:00 2018-08-01 04:00:00        1.0       5.0   2.0
6  2018-08-01 06:00:00 2018-08-01 05:00:00        1.0       6.0   2.0
7  2018-08-01 07:00:00 2018-08-01 06:00:00        1.0       7.0   2.0
8  2018-08-01 08:00:00 2018-08-01 07:00:00        1.0       8.0   3.0
9  2018-08-01 09:00:00 2018-08-01 08:00:00        1.0       9.0   3.0
10 2018-08-01 10:00:00 2018-08-01 09:00:00        1.0      10.0   3.0

谢谢。然而,这假设每5小时总是提供数据。如果没有,它将显示旅程1、3、4等。在这种情况下,它可以工作,但不是通用的。 - Jeroen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接