在熊猫中,有没有一种从特定日期开始按月分组的方法?

时间:2019-07-17 17:51:16

标签: pandas pandas-groupby

我正在尝试按月对python中的某些数据进行分组,但是我需要从每月25日开始的月份,在Pandas中有没有办法做到这一点?

数周以来,有一种从星期一,星期二等开始的方法...但是几个月以来,它总是一个月。

pd.Grouper(key='date', freq='M')

2 个答案:

答案 0 :(得分:1)

您可以将日期和24天分组:

np.random.seed(1)
dates = pd.date_range('2019-01-01', '2019-04-30', freq='D')
df = pd.DataFrame({'date':dates,
                   'val': np.random.uniform(0,1,len(dates))})

# for groupby
s = df['date'].sub(pd.DateOffset(24))

(df.groupby([s.dt.year, s.dt.month], as_index=False)
   .agg({'date':'min', 'val':'sum'})
)

给予

        date        val
0 2019-01-01  10.120368
1 2019-01-25  14.895363
2 2019-02-25  14.544506
3 2019-03-25  17.228734
4 2019-04-25   3.334160

另一个例子:

np.random.seed(1)
dates = pd.date_range('2019-01-20', '2019-01-30', freq='D')
df = pd.DataFrame({'date':dates,
                   'val': np.random.uniform(0,1,len(dates))})

s = df['date'].sub(pd.DateOffset(24))
df['groups'] = df.groupby([s.dt.year, s.dt.month]).cumcount()

给予

         date       val  groups
0  2019-01-20  0.417022       0
1  2019-01-21  0.720324       1
2  2019-01-22  0.000114       2
3  2019-01-23  0.302333       3
4  2019-01-24  0.146756       4
5  2019-01-25  0.092339       0
6  2019-01-26  0.186260       1
7  2019-01-27  0.345561       2
8  2019-01-28  0.396767       3
9  2019-01-29  0.538817       4
10 2019-01-30  0.419195       5

您将看到如何在第25天重新开始累积金额。

答案 1 :(得分:0)

我准备了以下测试DataFrame:

         Dat  Val
0 2017-03-24    0
1 2017-03-25    0
2 2017-03-26    1
3 2017-03-27    0
4 2017-04-24    0
5 2017-04-25    0
6 2017-05-24    0
7 2017-05-25    2
8 2017-05-26    0

第一步是计算“日期转换”列:

df['Dat2'] = df.Dat + pd.DateOffset(days=-24)

结果是:

         Dat  Val       Dat2
0 2017-03-24    0 2017-02-28
1 2017-03-25    0 2017-03-01
2 2017-03-26    1 2017-03-02
3 2017-03-27    0 2017-03-03
4 2017-04-24    0 2017-03-31
5 2017-04-25    0 2017-04-01
6 2017-05-24    0 2017-04-30
7 2017-05-25    2 2017-05-01
8 2017-05-26    0 2017-05-02

如您所见, Dat2 中的三月日期从原始日期 2017-03-25 开始, 等等。

1 的值在3月( Dat2 ), 2 的值在5月(也是 Dat2 )。

然后计算按月总计,我们可以运行:

df.groupby(pd.Grouper(key='Dat2', freq='MS')).sum()

获取:

            Val
Dat2           
2017-02-01    0
2017-03-01    1
2017-04-01    0
2017-05-01    2

所以我们有正确的分组方式:

  • 1 是三月,
  • 2 在五月。

与其他答案相比,优点是您将所有日期都放在第一个 当然要记住一个月的一天,例如 2017-03-01 结果表示从 2017-03-25 2017-04-24 (包括)的时间段。