2014-11-14 156 views
0

我有以下熊猫数据帧: 编辑:它是由CREATED_DATE计算时间差

排序
created_date incoming_message 
0 11/13/2014 18:06 1 
1 11/13/2014 21:56 0 
2 11/14/2014 3:40  1 
3 11/14/2014 3:55  1 
4 11/14/2014 5:09  0 

incoming_message表示该消息的方向(1 =呼入, 0 =传出)。 我试图找出消息交换的平均时间。 含义,1)响应的时间(外发消息),以及2)听到多久(传入消息)。 如果有多个传入消息,我想根据第一个传入消息计算持续时间。

对于

2 11/14/2014 3:40  1 
3 11/14/2014 3:55  1 
4 11/14/2014 5:09  0 

我应该算

2 11/14/2014 3:40  1 
4 11/14/2014 5:09  0 

这里的时间是我的尝试:

def responseTime(df): 
    ttr = [] #time to respond 
    tth = [] #time to hear back 
    i = 0 
    j = i+1 
    while j <= df.count().max()-1: 
     while df.iloc[i]['incoming_message'] == df.iloc[j]['incoming_message']: 
      j += 1 
     fd = df.iloc[i] 
     nd = df.iloc[j] 
     if fd['incoming_message'] != nd['incoming_message']: 
      if fd['incoming'] == 1: 
       ttr.append((nd['created_date'] - fd['created_date']).seconds/3600.0) 
      else: 
       tth.append((nd['created_date'] - fd['created_date']).seconds/3600.0) 
     i = j 
     j = i+1 
    return np.mean(ttr), np.mean(tth) 

虽然此功能,我觉得有更有效的办法解决问题。任何意见和建议将不胜感激!

回答

2

不确定您想要输出的内容(例如,如果您想要转换或不转换)。 这是groupby。

In [91]: df 
Out[91]: 
       date value 
0 2014-11-13 18:06:00  1 
1 2014-11-13 21:56:00  0 
2 2014-11-14 03:40:00  1 
3 2014-11-14 03:55:00  1 
4 2014-11-14 05:09:00  0 

创建石斑鱼。这是一个分区程序,它可以找到值发生更改的断点,并根据该断点创​​建组。

In [92]: grouper = (df.value.diff(1)==1).cumsum() 

In [93]: grouper 
Out[93]: 
0 0 
1 0 
2 1 
3 1 
4 1 
Name: value, dtype: int64 

In [94]: g = df.groupby(grouper) 

计算日期列的最后一个值减去第一个值,产生一个timedelta。 这些是每个GROUP(例如,这就是索引代表的)。

In [95]: g['date'].last()-g['date'].first() 
Out[95]: 
value 
0  03:50:00 
1  01:29:00 
Name: date, dtype: timedelta64[ns] 

如果您想保留原始数据的来源。这是一种转换类型的操作。

In [105]: result = g['date'].transform('last')-g['date'].transform('first') 

In [106]: result 
Out[106]: 
0 03:50:00 
1 03:50:00 
2 01:29:00 
3 01:29:00 
4 01:29:00 
dtype: timedelta64[ns] 

然后,您需要选择原始断点发生的索引。

In [108]: result.iloc[grouper.drop_duplicates(take_last=True).index] 
Out[108]: 
1 03:50:00 
4 01:29:00 
dtype: timedelta64[ns] 

这些都是相当高效的,因为这些都是矢量化操作。

+0

谢谢!我从你的回答中了解了一些关于熊猫的知识 – chungsangh 2014-11-17 18:06:44

+0

我得到了总体思路和方法,但是你能否详细说明石斑鱼在做什么?我的印象是,如果表示断点,石斑将是[0,1,0,0,1]。 – chungsangh 2014-11-17 18:26:06

+0

我按照你的'描述'进行分组。如果它真的[0,1,0,0,1]那么它更容易。督察。似乎你想计算4和2之间的差异(并且3在该组中)。暗示0,1在另一组中。 – Jeff 2014-11-17 22:23:01