代码之家  ›  专栏  ›  技术社区  ›  Bartek Malysz

熊猫如何在时间段上过滤数据帧

  •  4
  • Bartek Malysz  · 技术社区  · 7 年前

    我有一个包含下表的文件:

        Name        AvailableDate            totalRemaining
    0   X3321       2018-03-14 13:00:00      200
    1   X3321       2018-03-14 14:00:00      200
    2   X3321       2018-03-14 15:00:00      200
    3   X3321       2018-03-14 16:00:00      200
    4   X3321       2018-03-14 17:00:00      193
    

    我想返回一个数据帧,其中包含特定 时间 期间,无论实际 日期

    我在这里举了一个例子:

    filter pandas dataframe by time

    但当我执行以下命令时:

    ## setup
    import pandas as pd
    import numpy as np
    
    ### Step 2
    ### Check available slots
    file2 = r'C:\Users\user\Desktop\Files\data.xlsx'
    
    slots = pd.read_excel(file2,na_values='')
    
    ## filter the preferred ones
    slots['nextAvailableDate'] = pd.to_datetime((slots['nextAvailableDate']))
    
    
    slots['times'] = pd.to_datetime((slots['nextAvailableDate']))
    slots = slots[slots['times'].between('21:00:00', '02:00:00')]
    

    这将返回空数据帧以及此解决方案:

    slots = slots[slots['times'].dt.strftime('%H:%M:%S').between('21:00:00', '02:00:00')]
    

    有没有一种方法可以在不单独创建时间列的情况下正确执行此操作?请问我应该如何处理这个问题?

    我的目标:

    Name        AvailableDate            totalRemaining
    0   X3321       2018-03-14 21:00:00      200
    1   X3321       2018-03-14 22:00:00      200
    2   X3321       2018-03-14 23:00:00      200
    3   X3321       2018-03-14 00:00:00      200
    4   X3321       2018-03-14 01:00:00      193
    

    对于数据集中显示的每一天。

    2 回复  |  直到 5 年前
        1
  •  6
  •   jezrael    7 年前

    我认为需要 between_time 使用 Datetimeindex 创建人 set_index ,对于列添加 reset_index 具有 reindex 对于相同的列顺序:

    print (slots)
         Name        AvailableDate  totalRemaining
    0   X3321  2018-03-14 21:00:00             200
    1   X3321  2018-03-14 20:00:00             200
    2   X3321  2018-03-14 22:00:00             200
    3   X3321  2018-03-14 23:00:00             200
    4   X3321  2018-03-14 00:00:00             200
    5   X3321  2018-03-14 01:00:00             193
    6   X3321  2018-03-14 13:00:00             200
    7   X3321  2018-03-14 14:00:00             200
    8   X3321  2018-03-14 15:00:00             200
    9   X3321  2018-03-14 16:00:00             200
    10  X3321  2018-03-14 17:00:00             193
    
    slots['AvailableDate'] = pd.to_datetime(slots['AvailableDate'])
    
    df = (slots.set_index('AvailableDate')
              .between_time('21:00:00', '02:00:00')
              .reset_index()
              .reindex(columns=df.columns))
    print (df)
            AvailableDate   Name  totalRemaining
    0 2018-03-14 21:00:00  X3321             200
    1 2018-03-14 22:00:00  X3321             200
    2 2018-03-14 23:00:00  X3321             200
    3 2018-03-14 00:00:00  X3321             200
    4 2018-03-14 01:00:00  X3321             193
    
        2
  •  5
  •   Dhanasekaran Anbalagan    4 年前

    您可以使用 pd.Series.between 具有 datetime 对象,如下所示。

    from datetime import datetime
    
    start = datetime.strptime('21:00:00', '%H:%M:%S').time()
    end = datetime.strptime('02:00:00', '%H:%M:%S').time()
    
    slots = slots[slots['times'].dt.time.between(start, end)]
    

    示例用法

    from datetime import datetime
    import pandas as pd
    
    slots = pd.DataFrame({'times': ['2018-03-08 05:00:00', '2018-03-08 07:00:00',
                                    '2018-03-08 01:00:00', '2018-03-08 20:00:00',
                                    '2018-03-08 22:00:00', '2018-03-08 23:00:00']})
    
    
    slots['times'] = pd.to_datetime(slots['times'])
    
    start = datetime.strptime('21:00:00', '%H:%M:%S').time()
    end = datetime.strptime('23:30:00', '%H:%M:%S').time()
    
    slots = slots[slots['times'].dt.time.between(start, end)]
    
    #                 times
    # 4 2018-03-08 22:00:00
    # 5 2018-03-08 23:00:00