python - 如何找到大于 n 的连续值的数量,从最近的日期回溯

标签 python pandas

我正在通过 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/

相关文章:

python - 问 : Pandas dataframe from for loop

python - 迭代pandas数据框中的多列和行

Python将int添加到日期中并且仅返回工作日日期而忽略周末

python - 如何确保 Qt 表格单元格中的所有数据都可见?

javascript - Python Mechanize - 选择一个值并提交不起作用

python - 中心 Seaborn 颜色条标签

python - 为什么我在尝试使用 snscraper 时会收到此错误?

python - 如何在脚本中加载 tflite 模型?

python - 如何从私有(private)认证的 Artifactory PyPI 存储库中提取 Python 包?

python - 基于变量的绘图背景形状