【问题标题】:Pandas : Finding correct time window熊猫:找到正确的时间窗口
【发布时间】:2021-06-17 07:04:20
【问题描述】:

我有一个 pandas 数据框,它每小时更新一次最新的每小时数据。我必须根据阈值过滤掉 ID,即 PR_Rate > 50 和 CNT_12571

df_thld=df[(df['Date'] > df['Date'].max() - pd.Timedelta(hours=5))& (df.PR_Rate>50) & (df.CNT_12571 < 30)]
df_thld.loc[:,'HR_CNT'] = df_thld.groupby('ID')['Date'].nunique().to_frame('HR_CNT').reset_index() 
df_thld[(df_thld['HR_CNT'] >3] 

这种方法的问题在于,由于回溯期要求是 5 小时,因此,此 HR_CNT 可以计算任何违反此标准的非连续小时。 我的数据集如下: DataFrame

Date               IDs  CT_12571    PR_Rate
16/06/2021 10:00    A1  15      50.487
16/06/2021 11:00    A1  31      40.806
16/06/2021 12:00    A1  25      52.302
16/06/2021 13:00    A1  13      61.45
16/06/2021 14:00    A1  7       73.805

在上述 Dataframe 中,阈值未在 1100 小时时突破,但在计算小时数时,10、12 和 13 小时是违反阈值的小时数,而不是要求的 12、13、14 小时。每个 id 可能会或可能不会在一天内违反此标准。任何想法,我该如何解决这个问题?

【问题讨论】:

    标签: python-3.x pandas dataframe datetime


    【解决方案1】:

    如果我误解了您的问题,请原谅。据我了解,您有一个每小时更新的数据框。此数据框的示例如下所示为 df。从此数据框中,您只想过滤满足以下两个条件的行:

    1. PR_Rate > 50 和 CNT_12571
    2. 当且仅当连续三个小时超过阈值时

    鉴于这些假设,我将按以下步骤进行:
    df:

    Date    IDs CT_1257 PR_Rate
    0   2021-06-16 10:00:00 A1  15  50.487
    1   2021-06-16 12:00:00 A1  31  40.806
    2   2021-06-16 14:00:00 A1  25  52.302
    3   2021-06-16 15:00:00 A1  13  61.450
    4   2021-06-16 16:00:00 A1  7   73.805
    

    注意,在这个数据帧中,满足上述条件的唯一时间 fr5ame 是 14:00、15:00 和 16:00 的条目。

    def filterFrame(df, dur, pr_threshold, ct_threshold):
        ff = df[(df['CT_1257']< ct_threshold) & (df['PR_Rate'] >pr_threshold) ].reset_index()
        ml = list(ff.rolling(f'{dur}h', on='Date').count()['IDs'])
        r = len(ml)- 1
        rows= []
        while r >= 0:       
            end = r
            start = None
            if int(ml[r]) < dur:         
                r -= 1
            else:
                k = int(ml[r])
                for i in range(k):
                    rows.append(r-i)
                r -= k
        rows =  rows[::-1]
        return ff.filter(items= rows, axis = 0).reset_index()
                
    

    运行filterFrame(df, 3, 50, 30) 产生:

       level_0  index   Date            IDs CT_1257 PR_Rate
        0   1   2   2021-06-16 14:00:00 A1  25  52.302
        1   2   3   2021-06-16 15:00:00 A1  13  61.450
        2   3   4   2021-06-16 16:00:00 A1  7   73.805  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      • 2016-04-28
      • 1970-01-01
      • 2017-03-30
      • 2018-11-22
      • 1970-01-01
      • 2016-09-10
      相关资源
      最近更新 更多