簡體   English   中英

如何檢查列表中的連續時間戳

[英]How to check for consecutive timestamp in a list

我有一本字典,其值如下:

{
'original_data': [{'1600995180': 64.71666666666667, '1600995240': 0.17222222222222222, '1600995300': 0.16111111111111112, '1600995360': 0.6666666666666666, '1600995420': 0.17222222222222222, '1600995480': 0.0, '1600995540': 0.0, '1600995600': 0.0, '1600995660': 0.0, '1600995720': 0.0, '1600995780': 0.0, '1600995840': 1.0, '1600995900': 1.0, '1600995960': 1.0, '1600996020': 0.0, '1600996080': 0.0, '1600996140': 1.0, '1600996200': 1.0, '1600996260': 1.0, '1600996320': 0.0, '1600996380': 0.0, '1600996440': 0.0, '1600996500': 0.0, '1600996560': 0.0, '1600996620': 0.0, '1600996680': 0.0, '1600996740': 0.0, '1600996800': 0.0, '1600996860': 0.0, '1600996920': 10.86944444444444, '1600996980': 106.88333333333331}],
'outliers': [0.16111111111111112, 0.17222222222222222, 0.17222222222222222, 0.6666666666666666, 10.86944444444444, 64.71666666666667, 106.88333333333331]
}

original_data包含一個值為{timestamp: value}的列表。 離群值只包含來自 original_data 的離群value

我想實際比較outlier value中的每個value ,然后在original_data查看這些值是否與時間戳連續出現。 每個數據點的時間戳相隔 1 分鍾

def consecutively(data):
    values = data['original_data'][0].values()
    out = data['outliers']
    b = False
    for v in values:
        if v in out:
            if b:
                return True
            else:
                b = True
        else:
            b = False
    return False

這行得通!

PS 我不確定將“original_data”用作只有 1 個項目的列表,這是一個字典。 為什么不直接使用字典?

我有一個建議,那就是在 pandas DataFrame處理這個DataFrame

我將調用您的原始字典data 它的格式有點奇怪,但可以輕松處理:

import pandas as pd  # pip install pandas if you don't have it

df = pd.DataFrame(data["original_data"]).T.reset_index()

df.columns = ["timestamp", "value"]  # change the column names to something descriptive

### OPTIONAL (convert UNIX timestamps to pandas Timestamp to makes things clearer)
df["timestamp"] = pd.to_datetime(df.timestamp, unit="s")
###

df["outlier"] = df.value.isin(data["outliers"])  # add a column to show whether a value was an outlier

到這一步,你就大功告成了! 您可以檢查df並查看:

             timestamp       value  outlier
0  2020-09-25 00:53:00   64.716667     True
1  2020-09-25 00:54:00    0.172222     True
2  2020-09-25 00:55:00    0.161111     True
3  2020-09-25 00:56:00    0.666667     True
4  2020-09-25 00:57:00    0.172222     True
5  2020-09-25 00:58:00    0.000000    False
6  2020-09-25 00:59:00    0.000000    False
7  2020-09-25 01:00:00    0.000000    False
8  2020-09-25 01:01:00    0.000000    False
9  2020-09-25 01:02:00    0.000000    False
10 2020-09-25 01:03:00    0.000000    False
11 2020-09-25 01:04:00    1.000000    False
12 2020-09-25 01:05:00    1.000000    False
13 2020-09-25 01:06:00    1.000000    False
14 2020-09-25 01:07:00    0.000000    False
15 2020-09-25 01:08:00    0.000000    False
16 2020-09-25 01:09:00    1.000000    False
17 2020-09-25 01:10:00    1.000000    False
18 2020-09-25 01:11:00    1.000000    False
19 2020-09-25 01:12:00    0.000000    False
20 2020-09-25 01:13:00    0.000000    False
21 2020-09-25 01:14:00    0.000000    False
22 2020-09-25 01:15:00    0.000000    False
23 2020-09-25 01:16:00    0.000000    False
24 2020-09-25 01:17:00    0.000000    False
25 2020-09-25 01:18:00    0.000000    False
26 2020-09-25 01:19:00    0.000000    False
27 2020-09-25 01:20:00    0.000000    False
28 2020-09-25 01:21:00    0.000000    False
29 2020-09-25 01:22:00   10.869444     True
30 2020-09-25 01:23:00  106.883333     True

這會告訴你你想知道什么。 或者,如果您想明確標記一個異常值是否在另一個異常值之前,您可以這樣做

df["is_outlier_preceded_by_outlier"] = df.outlier & df.outlier.diff().eq(False)

這將創建一個值為True的列,該值是一個異常值並且前面是另一個異常值,否則為False

df.query("is_outlier_preceded_by_outlier")返回True

編輯:或者(不太明顯但更具可擴展性)

df["is_outlier_preceded_by_outlier"] = df.outlier.rolling(2).sum().eq(2)

也可以工作,您可以將 2(在兩個地方)更改為您喜歡查找 N 個連續異常值的任何數字。

編輯 2:所以,如果你想要每組 N 個連續異常值的值,那就有點棘手了:

groups = df.outlier.diff().ne(0).cumsum()

is_part_of_long_group = df.outlier.groupby(groups).transform("size").ge(3)

df["one_of_many_outliers"] = is_part_of_long_group & df.outlier

df.query("one_of_many_outliers").value

首先,我們必須在outlier列中識別相同值的組。 df.outlier.diff().ne(0).cumsum()創建一個系列,我們將其用作分組索引,每當outlier列中的下一個值與前一個值不同時,其outlier就會遞增。

接下來我們通過這個“索引”對outlier列進行分組,並使用transform方法來獲取每組連續值的大小。 最后,我們檢查該組的大小是否大於或等於 3,即我們查找長度至少為 3 個項目的連續值組。

請注意,盡管agg("size")會給我們每個組及其大小,但transform("size")獲取每個組的大小並將其映射回原始df.outlier系列。

最后,我們對連續的非異常值不感興趣,因此我們檢查值是否既是異常值是一長組連續相等值的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM