3 回答
TA贡献1883条经验 获得超3个赞
这是一种无需 for 循环即可获得结果的方法。我假设输入数据被读入一个名为 df 的数据帧:
# Initialize the output df
dfout = pd.DataFrame()
dfout['Event'] = df['Event']
dfout['EventStartTime'] = df['Time']
现在,我创建了一个名为“change”的变量,它告诉您事件是否发生了变化。
dfout['change'] = df['Event'].diff()
这就是 dfout 现在的样子:
Event EventStartTime change
0 0 2020-02-12 11:00:00 NaN
1 0 2020-02-12 11:30:00 0.0
2 2 2020-02-12 12:00:00 2.0
3 1 2020-02-12 12:30:00 -1.0
4 0 2020-02-12 13:00:00 -1.0
5 0 2020-02-12 13:30:00 0.0
6 0 2020-02-12 14:00:00 0.0
7 1 2020-02-12 14:30:00 1.0
8 0 2020-02-12 15:00:00 -1.0
9 0 2020-02-12 15:30:00 0.0
现在,我继续删除事件未更改的行:
dfout = dfout.loc[dfout['change'] !=0 ,:]
现在,这将给我留下事件已更改的行。
接下来,当前事件的事件结束时间就是下一个事件的开始时间。
dfout['EventEndTime'] = dfout['EventStartTime'].shift(-1)
数据框如下所示:
Event EventStartTime change EventEndTime
0 0 2020-02-12 11:00:00 NaN 2020-02-12 12:00:00
2 2 2020-02-12 12:00:00 2.0 2020-02-12 12:30:00
3 1 2020-02-12 12:30:00 -1.0 2020-02-12 13:00:00
4 0 2020-02-12 13:00:00 -1.0 2020-02-12 14:30:00
7 1 2020-02-12 14:30:00 1.0 2020-02-12 15:00:00
8 0 2020-02-12 15:00:00 -1.0 NaN
如果不需要,您可以选择删除“更改”列以及最后一行。
TA贡献1719条经验 获得超6个赞
假设数据框是data:
current_event = None
result = []
for event, time in zip(data['Event'], data['Time']):
if event != current_event:
if current_event is not None:
result.append([current_event, start_time, time])
current_event, start_time = event, time
data = pandas.DataFrame(result, columns=['Event','EventStartTime','EventEndTime'])
诀窍是保存您的事件编号;如果下一个事件编号与保存的事件编号不同,则必须结束已保存的事件并开始新的事件。
TA贡献1828条经验 获得超3个赞
使用 group by 和 agg 以获取所需格式的输出。
df =pd.DataFrame([['0',11],['1',12],['1',13],['0',15],['1',16],['3',11]],columns=['Event','Time'] )
df.groupby(['Event']).agg(['first','last']).rename(columns={'first':'start-event','last':'end-event'})
输出:
Event start-event end-event
0 11 15
1 12 16
3 11 11
添加回答
举报