【问题标题】:Python: create a new dataframe column and write the index correspondig to datetime intervalsPython:创建一个新的数据框列并写入与日期时间间隔对应的索引
【发布时间】:2015-10-14 22:32:53
【问题描述】:

我有以下数据框:

 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' 列,但不会在'session' 列中写入会话索引(即bounds 数据帧中的行索引),因此不要按间隔分隔初始数据帧:

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_startdate_end 之间的不同区间@ 987654333@ 我想如果 df['date_time'] 与 bounds['start_date'] 不同,它已经增加了session 的索引,这不正是我想要的

【问题讨论】:

  • bounds 中的date_start09:19:00 开始时,我不明白为什么在09:15:00 之前的行中会话值为1?
  • @EdChum,对不起,我只是给出了我拥有的数据框结构的示例,而不是确切的值!如果您需要确切的值来得出答案,请随时向我询问!
  • 请贴出不正确的输出和想要的输出,英文有代码没有的微妙含义
  • 像这样:In [306]: df df['Session'] = bounds['date_start'].searchsorted(df['date_time']) df Out[306]: date_time Session 0 2015-07-30 10:32:54 0 1 2015-07-30 10:32:54 0 2 2015-07-30 10:36:39 1 3 2015-07-30 10:36:39 1 4 2015-07-30 10:36:39 1 5 2015-07-30 10:36:39 1 6 2015-07-30 10:37:00 1 7 2015-07-30 10:37:00 1 8 2015-07-30 10:37:00 1 9 2015-07-30 10:37:00 1 和你想要的输出一样
  • 这是 searchsorted 的默认行为它匹配然后它的索引是当前索引值之前的位置如果你希望它落入下一个 bin 值那么你需要扩大开始间隔也许从它或类似的时间中减去 1 秒

标签: python pandas dataframe


【解决方案1】:

我假设您想要实际的索引位置(从零开始),您可以在“日期时间”列上调用 apply 并调用 np.searchsorted 以查找它在 bounds df 中所在位置的索引位置在:

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

【讨论】:

  • 此处无需使用apply:In [40]: bounds['date_start'].searchsorted(df['date_time']) Out[40]: array([0, 0, 0, 0, 1, 1, 2])
  • 此外,从技术上讲,这应该是开始/结束时间之间的界限(例如,如果超出界限,searchsorted 将返回 -1),但这是 OP 没有提供数据的细节。
  • @Jeff 是的,问题域没有被完全描述,但 OP 似乎对这里的行为很满意,-1 标记 OOB 不一定是坏事
  • 当我验证时它对我不起作用,实际上我需要为每个会话增加一个索引 +1,但是如果,例如,在bounds 数据帧中,我有以下两个第一个 date_start : 2015-07-30 10:32:54.000 , 2015-07-30 11:58:57.000 ,在应用您的代码后,我已经在 Session 中增加了 2015-07-30 10:36:39.000 的索引df dataframe ,紧挨着 2015-07-30 10:32:54.000 ,即这意味着它应该是第二个间隔,尽管它根据bounds dataframe 保持相同的间隔
  • 那么为什么不直接添加1df['session'] = bounds['date_start'].searchsorted(df['date_time']) + 1?
猜你喜欢
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 2014-08-12
  • 2020-04-10
相关资源
最近更新 更多