代码之家  ›  专栏  ›  技术社区  ›  Rebecca James

从dataframe中选择多个日期范围

  •  2
  • Rebecca James  · 技术社区  · 2 年前

    我有一个带有日期和价格的数据框(如下所示)。

    df=pd.DataFrame({'date':['2015-01-01','2015-01-02','2015-01-03',
                             '2016-01-01','2016-01-02','2016-01-03',
                             '2017-01-01','2017-01-02','2017-01-03',
                             '2018-01-01','2018-01-02','2018-01-03'],
                      'price':[78,87,52,94,55,45,68,76,65,75,78,21]
                    })
    df['date'] = pd.to_datetime(df['date'], errors='ignore', format='%Y%m%d')
    select_dates = df.set_index(['date'])
    

    我想选择一系列要添加到新数据框的特定日期。例如,我想选择2015年第一季度和2016年第一季度的价格。我为示例提供了较短时间段的数据,因此在本例中,我想选择2015年的前两天和2016年的前两天。

    我希望最终得到这样一个数据框架(以日期为索引)。

    日期 价格
    2015-01-01 78
    2015-01-02 87
    94
    2016-01-02 55

    我一直在使用这种方法来选择日期,但我不知道如何一次选择多个范围

    select_dates2=select_dates.loc['2015-01-01':'2015-01-02']
    
    2 回复  |  直到 2 年前
        1
  •  1
  •   Onyambu    2 年前

    另一种方式:

    df['date'] = pd.to_datetime(df['date'])
    df[df.date.dt.year.isin([2015, 2016]) & df.date.dt.day.lt(3)]
    
            date  price
    0 2015-01-01     78
    1 2015-01-02     87
    3 2016-01-01     94
    4 2016-01-02     55
    
        2
  •  1
  •   sammywemmy    2 年前

    一种选择是将索引作为日期对象的多索引;这允许在多个级别(在本例中为年和日)上进行相对简单的选择:

    (df
    .assign(year = df.date.dt.year, day = df.date.dt.day)
    .set_index(['year', 'day'])
    .loc(axis = 0)[2015:2016, :2]
    )
                   date  price
    year day
    2015 1   2015-01-01     78
         2   2015-01-02     87
    2016 1   2016-01-01     94
         2   2016-01-02     55
    
        3
  •  1
  •   enke    2 年前

    一种选择是使用 dt 访问者选择特定年份和月份,然后使用 isin 创建要过滤的布尔掩码的步骤 df .

    df['date'] = pd.to_datetime(df['date'])
    out = df[df['date'].dt.year.isin([2015, 2016]) & df['date'].dt.strftime('%m-%d').isin(['01-01','01-02'])]
    

    输出:

             date  price
    0  2015-01-01     78
    1  2015-01-02     87
    3  2016-01-01     94
    4  2016-01-02     55