Python 在给定行的N秒内,我的数据帧中是否有一行?

Python 在给定行的N秒内,我的数据帧中是否有一行?,python,pandas,Python,Pandas,现在,我想为s的每一行创建一个布尔列,指示在接下来的N秒内是否还有另一行 我可以使用itertools,但这不是pandonic,在我想在数据帧上这样做的情况下也不能很好地推广。我想解决的一个相关问题是: population = pd.date_range(periods=1000,start='2015-01-01',freq='s') timestamps = np.random.choice(population,size=16,replace=False) s = pd.Series(

现在,我想为
s
的每一行创建一个布尔列,指示在接下来的N秒内是否还有另一行

我可以使用itertools,但这不是pandonic,在我想在数据帧上这样做的情况下也不能很好地推广。我想解决的一个相关问题是:

population = pd.date_range(periods=1000,start='2015-01-01',freq='s')
timestamps = np.random.choice(population,size=16,replace=False)
s = pd.Series(timestamps)
对于此数据帧中的每一行,是否有一行在接下来的N秒内具有相同的
id\u col


我总是可以编写一个函数,它只需要一行,然后检查整个数据帧,但我觉得可能有更好的方法。想法?

我认为这是一个关于连续值之间的时间差的问题(按时间戳排序后):

N='30s'
s_排序=s.排序值()
delta=s_排序-s_排序.shift()
flag=(增量

对于第二个问题,您可以使用相同的方法对id列进行分组。

我认为这是一个关于连续值之间的时间差的问题(按时间戳排序后):

N='30s'
s_排序=s.排序值()
delta=s_排序-s_排序.shift()
flag=(增量

对于第二个问题,您可以使用相同的方法对id列进行分组。

此方法计算前导窗口计数,其中窗口是从每个事件到未来的秒数。计数包括数据点,因此始终至少为1。如果在
领先窗口
秒内发生三个事件,则计数为3

N = '30s'
s_sorted = s.sort_values()
deltas =  s_sorted -  s_sorted.shift()
flag = (deltas < N) | (deltas.shift(-1) < N)
pd.DataFrame({'s':s_sorted, 'flag':flag})

     flag                   s
7    True 2015-01-01 00:00:04
0    True 2015-01-01 00:00:32
8    True 2015-01-01 00:00:50
4    True 2015-01-01 00:00:58
5    True 2015-01-01 00:01:42
2    True 2015-01-01 00:01:57
1    True 2015-01-01 00:02:15
12  False 2015-01-01 00:03:52
14   True 2015-01-01 00:05:32
6    True 2015-01-01 00:05:57
11   True 2015-01-01 00:08:24
3    True 2015-01-01 00:08:36
13  False 2015-01-01 00:10:07
9    True 2015-01-01 00:13:53
15   True 2015-01-01 00:14:20
10  False 2015-01-01 00:15:14
您的示例代码随机生成事件(不按时间顺序)。我将时间戳的计数增加为1,这样我们就可以对时间窗口内发生的事件数量进行汇总,然后在时间戳上添加一个索引

from datetime import timedelta

def lead_count(s, lead_in_s):
  ssort = s.sort_index()
  lead = ssort.index + timedelta(seconds=lead_in_s)
  inds = np.searchsorted(ssort.index.astype(np.int64), lead.astype(np.int64)) - 1
  cs = ssort.cumsum()
  return pd.Series(cs[inds].values - cs.values + ssort[inds].values, index=ssort.index)
然后,如果您以30秒的窗口调用
lead\u count

>>> s = pd.Series([1]*len(timestamps), index=timestamps)
>>> s
2015-01-01 00:00:26    1
2015-01-01 00:05:15    1
2015-01-01 00:13:57    1
2015-01-01 00:10:45    1
2015-01-01 00:05:46    1
2015-01-01 00:00:01    1
2015-01-01 00:15:00    1
2015-01-01 00:13:12    1
2015-01-01 00:16:23    1
2015-01-01 00:13:18    1
2015-01-01 00:07:56    1
2015-01-01 00:00:47    1
2015-01-01 00:04:23    1
2015-01-01 00:02:58    1
2015-01-01 00:03:24    1
2015-01-01 00:11:34    1
dtype: int64

,它对插入值使用相同的二进制搜索方法来查找滚动累积和,但它着眼于过去(滞后)而不是未来(超前)

此方法计算前导窗口计数,其中窗口是从每个事件到未来的秒数。计数包括数据点,因此始终至少为1。如果在
领先窗口
秒内发生三个事件,则计数为3

N = '30s'
s_sorted = s.sort_values()
deltas =  s_sorted -  s_sorted.shift()
flag = (deltas < N) | (deltas.shift(-1) < N)
pd.DataFrame({'s':s_sorted, 'flag':flag})

     flag                   s
7    True 2015-01-01 00:00:04
0    True 2015-01-01 00:00:32
8    True 2015-01-01 00:00:50
4    True 2015-01-01 00:00:58
5    True 2015-01-01 00:01:42
2    True 2015-01-01 00:01:57
1    True 2015-01-01 00:02:15
12  False 2015-01-01 00:03:52
14   True 2015-01-01 00:05:32
6    True 2015-01-01 00:05:57
11   True 2015-01-01 00:08:24
3    True 2015-01-01 00:08:36
13  False 2015-01-01 00:10:07
9    True 2015-01-01 00:13:53
15   True 2015-01-01 00:14:20
10  False 2015-01-01 00:15:14
您的示例代码随机生成事件(不按时间顺序)。我将时间戳的计数增加为1,这样我们就可以对时间窗口内发生的事件数量进行汇总,然后在时间戳上添加一个索引

from datetime import timedelta

def lead_count(s, lead_in_s):
  ssort = s.sort_index()
  lead = ssort.index + timedelta(seconds=lead_in_s)
  inds = np.searchsorted(ssort.index.astype(np.int64), lead.astype(np.int64)) - 1
  cs = ssort.cumsum()
  return pd.Series(cs[inds].values - cs.values + ssort[inds].values, index=ssort.index)
然后,如果您以30秒的窗口调用
lead\u count

>>> s = pd.Series([1]*len(timestamps), index=timestamps)
>>> s
2015-01-01 00:00:26    1
2015-01-01 00:05:15    1
2015-01-01 00:13:57    1
2015-01-01 00:10:45    1
2015-01-01 00:05:46    1
2015-01-01 00:00:01    1
2015-01-01 00:15:00    1
2015-01-01 00:13:12    1
2015-01-01 00:16:23    1
2015-01-01 00:13:18    1
2015-01-01 00:07:56    1
2015-01-01 00:00:47    1
2015-01-01 00:04:23    1
2015-01-01 00:02:58    1
2015-01-01 00:03:24    1
2015-01-01 00:11:34    1
dtype: int64

,它对插入值使用相同的二进制搜索方法来查找滚动累积和,但它着眼于过去(滞后)而不是未来(超前)

你知道,我问的问题你是对的。我忘了问题的一部分。我将编辑它。很抱歉弄混了你能看看如何修改我的答案来得到你想要的吗?提示:试着重新理解
标志
行正在做什么。你知道,正如我问的问题,你是对的。我忘了问题的一部分。我将编辑它。很抱歉弄混了你能看看如何修改我的答案来得到你想要的吗?提示:尝试并取消重新理解
标志
行正在执行的操作。