Python:创建一个新的数据帧列,并将索引对应的日期时间间隔写入

时间:2015-10-14 09:37:33

标签: python pandas dataframe

我有以下数据框:

 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的索引,这不完全是我的意思寻找

1 个答案:

答案 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