我在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_down
为False
。也就是说,具有此标准的数据上的布尔掩码将是
dts[(dts['lag'] >= 7) | (dts['up_down'] == False)]
我感兴趣的是"平均跑步长度"但是,有了这个标准。我想计算连续时间戳对此条件成立的平均时间长度(从时间戳得出)。 根据这样的标准捕获运行的简单方法是什么?
在实践中,我已经完成了解决这个问题所需的所有步骤
index
并检查它是否增加1来基本确定连续时间戳中是否满足条件。到目前为止,这是我的解决方案,但我真正的问题在于第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'])
答案 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持续时间。