我正在尝试按月对python中的某些数据进行分组,但是我需要从每月25日开始的月份,在Pandas中有没有办法做到这一点?
数周以来,有一种从星期一,星期二等开始的方法...但是几个月以来,它总是一个月。
pd.Grouper(key='date', freq='M')
答案 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
所以我们有正确的分组方式:
与其他答案相比,优点是您将所有日期都放在第一个 当然要记住一个月的一天,例如 2017-03-01 结果表示从 2017-03-25 到 2017-04-24 (包括)的时间段。