我正在通过 API 获取一些带时间戳的数据(如下所示),我想检查从最近的条目(在本例中是最后一行)开始某个列值连续大于一定的阈值数字。这是我转换为 df 的一些示例数据:
ID Timestamp Value
0 20779453 2021-01-18 09:15:00Z 62.47612
1 20779453 2021-01-18 09:20:00Z 54.56400
2 20779453 2021-01-18 09:25:00Z 64.95384
3 20779453 2021-01-18 09:30:00Z 63.62500
4 20779453 2021-01-18 09:35:00Z 61.51790
在这种情况下,我想检查 Value 变量大于 60 的时间有多长(这里的答案是 3 次,即 15 分钟)。我对 python 不强,我的直觉是使用 for 循环遍历 df 并保留一个计数器,但我知道对 dfs 使用循环不是一个好习惯。我在这里创建了一个示例 df
data = [[20779453, '2021-01-18 09:15:00Z', 62.47612], [20779453, '2021-01-18 09:20:00Z', 54.56400],
[20779453, '2021-01-18 09:25:00Z', 64.95384], [20779453, '2021-01-18 09:30:00Z', 63.62500],
[20779453, '2021-01-18 09:35:00Z', 61.51790]]
df = pd.DataFrame(data, columns = ['ID', 'Timestamp', 'Value'])
count = df[df['Value']>60]['Value'].count()
count
基于上述代码的输出:4
预期输出:3(从最近的时间戳开始,该值连续大于60的次数为3)
编辑:另一个基于 Akshay 回答的测试用例:
data = [[20779453, '2021-01-18 09:15:00Z', 62.47612], [20779453, '2021-01-18 09:20:00Z', 54.56400],
[20779453, '2021-01-18 09:25:00Z', 64.95384], [20779453, '2021-01-18 09:30:00Z', 63.62500],
[20779453, '2021-01-18 09:35:00Z', 61.51790], [20779453, '2021-01-18 09:40:00Z', 63.62500],
[20779453, '2021-01-18 09:40:00Z', 53.62500],[20779453, '2021-01-18 09:45:00Z', 61.51790]]
df1 = pd.DataFrame(data, columns = ['ID', 'Timestamp', 'Value'])
from itertools import groupby
max([len(list(g)) for k, g in groupby(df['Value']>60) if k==True])
预期输出:1
当前输出:4
我认为我没有很好地理解的是我只关心最新的后续值而不是最长的。有什么想法吗?
最佳答案
IIUC,你想要从最后一个时间戳(向后)开始的最长序列的长度,其中值 > 60。
方法一:df.expanding()
你可以为此使用df.expanding
-
sum(df['Value'][::-1].expanding().apply(lambda x: np.all(x>60)))
# 3
对于您分享的第二个示例,
sum(df1['Value'][::-1].expanding().apply(lambda x: np.all(x>60)))
# 1
解释-
df1['Value'][::-1]
反转序列并且 .expanding()
对扩展组应用顺序检查 [0 , 0-1, 0-2, 0-3, 0-4...]
以检查该组中的每个值是否 > 60。如果是,则返回 1,否则返回 0。总结起来将给出您是满足条件的最长的最新时间戳序列。检查文档 here .
方法二:itertools.groupby
试试 itertools groupby
-
from itertools import groupby
[len(list(g)) for k, g in groupby(df['Value']>60) if k==True][-1]
# 3
对于您分享的第二个示例,
from itertools import groupby
[len(list(g)) for k, g in groupby(df1['Value']>60) if k==True][-1]
# 1
解释-
Itertools groupby 专为处理顺序出现的组而设计。
示例来自他们的 documentation -
[k for k, g in groupby('AAAABBBCCDAABBB')] #--> A B C D A B
[list(g) for k, g in groupby('AAAABBBCCD')] #--> AAAA BBB CC D
groupby df['Value']>60
返回连续的 True 和 False 组,分成单独的列表 -
[list(g) for k, g in groupby(df['Value']>60)]
#[[True], [False], [True, True, True]]
因此,您所要做的就是使用 k==True
仅过滤 True 值(其中 > 60),并使用 len(list(g)) 计算组的长度
。最后,使用 [-1]
从他们那里得到最后一个。
关于python - 如何找到大于 n 的连续值的数量,从最近的日期回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65802624/