我有以下数据框:
date_time value member
2013-10-09 09:00:00 664639 Jerome
2013-10-09 09:05:00 197290 Hence
2013-10-09 09:10:00 470186 Ann
2013-10-09 09:15:00 181314 Mikka
2013-10-09 09:20:00 969427 Cristy
2013-10-09 09:25:00 261473 James
2013-10-09 09:30:00 003698 Oliver
和我有界限的第二个数据框:
date_start date_end
2013-10-09 09:19:00 2013-10-09 09:25:00
2013-10-09 09:25:00 2013-10-09 09:40:00
所以我需要创建一个新列,我将在其中写下两个日期时间点之间每个时间间隔的索引:
像往常一样:date_time value member session
2013-10-09 09:00:00 664639 Jerome 1
2013-10-09 09:05:00 197290 Hence 1
2013-10-09 09:10:00 470186 Ann 1
2013-10-09 09:15:00 181314 Mikka 2
2013-10-09 09:20:00 969427 Cristy 2
2013-10-09 09:25:00 261473 James 2
2013-10-09 09:30:00 003698 Oliver 2
以下代码创建了列'session'
,但是没有在bounds
列中写入会话索引(即'session'
数据框中的行索引),所以不要&# 39; t按时间间隔分隔初始数据帧:
def create_interval():
df['session']=''
for index, row in bounds.iterrows():
s = row['date_start']
e = row['date_end']
mask=(df['date'] > s) & (df['date'] < e)
df.loc[mask]['session']='[index]'
return df
更新
代码bounds['date_start'].searchsorted(df['date_time'])
没有给出我想要获得的结果的问题,即每个区间的一个索引值:df['Session']
= 1表示第一个区间,= 2表示秒,依此类推。列Session
旨在分隔date_start
date_end
bounds
之间的不同间隔。
我想如果df [&#39; date_time&#39;]与[&#39; start_date&#39;]的界限不同,那么它已经增加了session
的索引,这不完全是我的意思寻找
答案 0 :(得分:2)
我假设你想要实际的索引位置(从零开始),你可以在'date_time'列上调用apply
并调用np.searchsorted
来找到bounds
中的索引位置1}}如果它落入:
In [266]:
df['Session'] = df['date_time'].apply(lambda x: np.searchsorted(bounds['date_start'], x)[0])
df
Out[266]:
date_time value member Session
0 2013-10-09 09:00:00 664639 Jerome 0
1 2013-10-09 09:05:00 197290 Hence 0
2 2013-10-09 09:10:00 470186 Ann 0
3 2013-10-09 09:15:00 181314 Mikka 0
4 2013-10-09 09:20:00 969427 Cristy 1
5 2013-10-09 09:25:00 261473 James 1
6 2013-10-09 09:30:00 3698 Oliver 2
修改强>
@Jeff指出apply
在这里是不必要的,当然他是对的,这会更快:
In [293]:
df['session'] = bounds['date_start'].searchsorted(df['date_time'])
df
Out[293]:
date_time value member session
0 2013-10-09 09:00:00 664639 Jerome 0
1 2013-10-09 09:05:00 197290 Hence 0
2 2013-10-09 09:10:00 470186 Ann 0
3 2013-10-09 09:15:00 181314 Mikka 0
4 2013-10-09 09:20:00 969427 Cristy 1
5 2013-10-09 09:25:00 261473 James 1
6 2013-10-09 09:30:00 3698 Oliver 2