捕捉"游程长度"在DataFrame中

时间:2017-01-17 19:43:02

标签: python python-2.7 pandas

我在DataFrame中有一些数据,其结构如下(这是模拟数据)

In[67]: dts
Out[67]: 
                       timestamp        lag up_down
0     2016-09-05 00:00:00.000000  10.975553    True
1     2016-09-05 00:18:52.229551   4.757383   False
2     2016-09-05 00:36:39.365184   8.555124   False
3     2016-09-05 00:49:42.976653   9.564206   False
4     2016-09-05 01:04:53.626044   2.380522   False
5     2016-09-05 01:19:50.601259  11.283831    True
6     2016-09-05 01:38:13.121235  10.648995    True
                         ...        ...     ...
12902 2017-01-17 12:26:18.614783   0.226865    True
12903 2017-01-17 12:36:56.317562   0.485407   False
12904 2017-01-17 12:47:07.889736   8.901771    True
12905 2017-01-17 13:05:15.205444  10.114116    True
12906 2017-01-17 13:23:50.930639   7.975374   False

我有一个标准可以使特定时间戳无法运行" - 滞后大于7或up_downFalse。也就是说,具有此标准的数据上的布尔掩码将是

dts[(dts['lag'] >= 7) | (dts['up_down'] == False)]

我的问题

我感兴趣的是"平均跑步长度"但是,有了这个标准。我想计算连续时间戳对此条件成立的平均时间长度(从时间戳得出)。 根据这样的标准捕获运行的简单方法是什么?

到目前为止我的想法和方法

在实践中,我已经完成了解决这个问题所需的所有步骤

  1. 我可以通过在上面提到的布尔掩码上使用index并检查它是否增加1来基本确定连续时间戳中是否满足条件。
  2. 然后我可以循环遍历每个连续索引的集合,并从上一个时间戳中减去第一个时间戳以生成timedelta。
  3. 我可以平均timedeltas
  4. 到目前为止,这是我的解决方案,但我真正的问题在于第2步 - 我知道在pandas中非常不赞成按行遍历DataFrame,我觉得应该有一些分组机制我可以在这里直接将我的last_timestamp - first_timestamp公式映射到平均值。

    生成模拟数据

    如果你想玩一些相同形式的模拟数据,这可能很方便

    import datetime
    import numpy as np
    import random
    import pandas as pd
    
    start_date = datetime.datetime(2016, 9, 5)
    end_date = datetime.datetime.now()
    
    dts = []
    cur_date = start_date 
    while cur_date < end_date:
        dts.append((cur_date, np.random.uniform(low=0.0, high=12.0), 
                    bool(random.getrandbits(1))))
        cur_date += datetime.timedelta(minutes=np.random.uniform(10, 20))
    dts = pd.DataFrame(dts, columns=['timestamp', 'lag', 'up_down'])
    

1 个答案:

答案 0 :(得分:0)

一种方式:

dts['criteria'] = (dts['lag'] >= 7) | (dts['up_down'] == False)
change = (h.criteria!=h.criteria.shift())
dts['ts'] = dts[change]['timestamp']

(df.ts.bfill()-df.ts.ffill()).shift(-1).fillna(0)

当您遇到标准更改时,仅为该行将时间戳添加到新列ts中。

回填并向前填充该列会将每组的最小值和最大值放在同一行上。然后你只需做差异,将结果移到适当的行上重新对齐,并填充非相关值0持续时间。