如何按月和年将熊猫数据框分为几个数据框

我有一个具有不同列(例如价格,id,产品和日期)的数据框,我需要根据系统的当前日期将此数据框分为几个数据框(current_date = np.datetime64(date.today()))。

例如,如果今天是2020-02-07,我想将主数据帧分为三个不同的数据帧,其中df1将是上个月的数据(2020-01-07到2020-02-07的数据),df2将是最近三个月的数据(不包括df1中已经存在的月份,因此可以更准确地说是从2019-10-07到2020-01-07),而df3是原始数据帧上剩余的数据。

有一些简单的方法可以做到这一点吗?另外,我一直在尝试使用Grouper,但是我还是反复出现此错误:NameError:未定义名称“ Grouper”(我的Pandas版本是0.24.2)

评论
  • 一起来看雷阵雨
    一起来看雷阵雨 回复

    You can use offsets.DateOffset for last 1mont and 3month datetimes, filter by boolean indexing:

    rng = pd.date_range('2019-10-10', periods=20, freq='5d')
    df = pd.DataFrame({'date': rng, 'id': range(20)})  
    print (df)
             date  id
    0  2019-10-10   0
    1  2019-10-15   1
    2  2019-10-20   2
    3  2019-10-25   3
    4  2019-10-30   4
    5  2019-11-04   5
    6  2019-11-09   6
    7  2019-11-14   7
    8  2019-11-19   8
    9  2019-11-24   9
    10 2019-11-29  10
    11 2019-12-04  11
    12 2019-12-09  12
    13 2019-12-14  13
    14 2019-12-19  14
    15 2019-12-24  15
    16 2019-12-29  16
    17 2020-01-03  17
    18 2020-01-08  18
    19 2020-01-13  19
    
    current_date = pd.to_datetime('now').floor('d')
    print (current_date)
    2020-02-07 00:00:00
    
    last1m = current_date - pd.DateOffset(months=1)
    last3m = current_date - pd.DateOffset(months=3)
    
    m1 = (df['date'] > last1m) & (df['date'] <= current_date)
    m2 = (df['date'] > last3m) & (df['date'] <= last1m)
    m3 = ~(m1 | m2)
    
    df1 = df[m1]
    df2 = df[m2]
    df3 = df[m3]
    
    print (df1)
             date  id
    18 2020-01-08  18
    19 2020-01-13  19
    
    print (df2)
             date  id
    6  2019-11-09   6
    7  2019-11-14   7
    8  2019-11-19   8
    9  2019-11-24   9
    10 2019-11-29  10
    11 2019-12-04  11
    12 2019-12-09  12
    13 2019-12-14  13
    14 2019-12-19  14
    15 2019-12-24  15
    16 2019-12-29  16
    17 2020-01-03  17
    
    print (df3)
            date  id
    0 2019-10-10   0
    1 2019-10-15   1
    2 2019-10-20   2
    3 2019-10-25   3
    4 2019-10-30   4
    5 2019-11-04   5