【问题标题】:How to assign group labels to pandas df rows that have a datetime within a specific interval?如何将组标签分配给具有特定时间间隔内的日期时间的 pandas df 行?
【发布时间】:2021-07-02 07:35:01
【问题描述】:

我正在尝试根据创建时间对 .txt 文件进行排序。每天在几分钟内多次创建一组 6-8 个 .txt 文件。我不知道确切的时间间隔,我必须找到一种方法来自动找到最接近的匹配日期时间(例如,所有时间间隔小于 15 分钟)。我已经能够为每个文件提取 DateTime。现在,我想分配一个组标签,指示已在一组中创建了哪些 .txt 文件(即彼此相隔几分钟内)。

我当前的 df 如下所示:

index                         values
2020-09-06 17:25:14           97
2020-09-06 17:25:33            0
2020-09-06 17:27:00            3
2020-09-06 17:28:13            7
2020-09-06 17:29:28           10
2020-09-06 17:30:07           26
2020-09-06 17:30:40           34
2020-09-06 17:31:13           34
2020-09-06 18:07:34           99
2020-09-06 18:08:07            0
2020-09-06 18:08:35            3
2020-09-06 18:09:00            8
2020-09-06 18:09:24           11
2020-09-06 18:09:57           32
2020-09-06 18:10:24           43
2020-09-06 19:03:45           99
2020-09-06 19:04:31            0

我想自动为 17:25 到 17:31 之间的所有行分配标签“a”,然后为 18:07 到 18:10 之间的所有行分配标签“b”,然后为所有行分配标签“c” 19:03 到 19:04 之间。

我发现的大多数解决方案,只有聚合(pd.groupby()、pd.resample()、pd.grouper())。我可以使用其中一种方法来创建我的标签吗?

我认为this 可能是一个有用的开始,但据我了解解决方案,它只为我创建指定索引的某个索引。

谢谢(如果可以的话,我很乐意在这里分享一个示例 .txt 文件和我的代码?)

【问题讨论】:

    标签: python pandas dataframe datetime intervals


    【解决方案1】:

    创建您的条件和选择,然后使用df.between_timenp.select

    cond = [df.index.isin(df.between_time('17:25', '17:31').index), 
            df.index.isin(df.between_time('18:07', '18:10').index),
            df.index.isin(df.between_time('19:03', '19:04').index)]
    
    choices = ['a', 'b', 'c']
    
    df['new_col'] = np.select(cond, choices, np.nan)
    
                         values new_col
    index                              
    2020-09-06 17:25:14      97       a
    2020-09-06 17:25:33       0       a
    2020-09-06 17:27:00       3       a
    2020-09-06 17:28:13       7       a
    2020-09-06 17:29:28      10       a
    2020-09-06 17:30:07      26       a
    2020-09-06 17:30:40      34       a
    2020-09-06 17:31:13      34     nan
    2020-09-06 18:07:34      99       b
    2020-09-06 18:08:07       0       b
    2020-09-06 18:08:35       3       b
    2020-09-06 18:09:00       8       b
    2020-09-06 18:09:24      11       b
    2020-09-06 18:09:57      32       b
    2020-09-06 18:10:24      43     nan
    2020-09-06 19:03:45      99       c
    2020-09-06 19:04:31       0     nan
    

    【讨论】:

    • 感谢您的回答。我只是不知道创建文件的确切时间。对不起,如果我不够具体。我需要搜索时间上靠得很近的行(例如相隔不到 15 分钟)。我在考虑时间增量,但这似乎有点过于极端,无法查看所有可能的时间增量,然后对最小的时间增量进行分组?
    • @Rene 对不起,我误解了你的问题。假设我们正确映射了 a、b、c,df.groupby(pd.Grouper(level=0, freq='15T', closed='right'))['values'].ngroup() 是否可以为您提供所需的信息?
    • 不用担心。感谢您的坚持。它确实有效。 'ngroup()' 是我一直在寻找的。其他解决方案使用聚合方法(例如 sum())而不是 'ngroup()'。这当然没用。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多