您好我有一个事件数据框,其中包含日期时间和事件ID以及传感器ID。我想将每个传感器在一小时内发生的事件分组,如果可能的话,用组计数标记它们。 原始数据框
sensor_id event_id time
0 A e1 2017-02-14 05:30:00
1 A e2 2017-02-14 05:45:00
2 A e3 2017-02-14 08:30:00
3 B e3 2017-02-14 05:20:00
4 B e4 2017-02-14 05:30:00
5 B e6 2017-02-14 05:45:00
6 C e1 2017-02-14 05:30:00
7 C e3 2017-02-14 07:30:00
8 C e7 2017-02-14 09:35:00
期望的结果:
sensor_id event_id time group
0 A e1 2017-02-14 05:30:00 1
1 A e2 2017-02-14 05:45:00 1
2 A e3 2017-02-14 08:30:00 2
3 B e3 2017-02-14 05:20:00 1
4 B e4 2017-02-14 05:30:00 1
5 B e6 2017-02-14 05:45:00 1
6 C e1 2017-02-14 05:30:00 1
7 C e3 2017-02-14 07:30:00 2
8 C e7 2017-02-14 09:35:00 3
我明白我应该按用户分组,事件然后,时间使用1小时的timdelta,但我不知道如何做其余的事情。任何提示将不胜感激。
答案 0 :(得分:3)
我认为你需要选择双组(希望sensor_id如果不是我们需要先排序),即
df['new'] = df.groupby('sensor_id').apply( lambda x : x.groupby(x['time'].dt.hour).ngroup()+1).values
输出:
sensor_id event_id time new 0 A e1 2017-02-14 05:30:00 1 1 A e2 2017-02-14 05:45:00 1 2 A e3 2017-02-14 08:30:00 2 3 B e3 2017-02-14 05:20:00 1 4 B e4 2017-02-14 05:30:00 1 5 B e6 2017-02-14 05:45:00 1 6 C e1 2017-02-14 05:30:00 1 7 C e3 2017-02-14 07:30:00 2 8 C e7 2017-02-14 09:35:00 3
答案 1 :(得分:2)
您可以使用pd.TimeGrouper
+ ngroup
按时间频率进行分组。
df['time'] = pd.to_datetime(df.time)
df['group'] = df.set_index('time').groupby(['sensor_id',
pd.TimeGrouper(freq='1H')], sort=False).ngroup().values
到目前为止,我们已经拥有了我们想要的内容,但我们需要重置每个group
的{{1}}值,以便进行另一次sensor_id
调用。
groupby