按日期(月)累计总和

时间:2017-03-09 09:24:40

标签: python pandas dataframe

我有一个熊猫数据框,我需要计算每个月的累积总和。

Date    Amount
2017/01/12  50
2017/01/12  30
2017/01/15  70
2017/01/23  80
2017/02/01  90
2017/02/01  10
2017/02/02  10
2017/02/03  10
2017/02/03  20
2017/02/04  60
2017/02/04  90
2017/02/04  100

累计金额是每天的尾随金额,即01-31。但是,有些日子不见了。数据框应该看起来像

Date    Sum_Amount
2017/01/12  80
2017/01/15  150
2017/01/23  203
2017/02/01  100
2017/02/02  110
2017/02/03  140
2017/02/04  390

1 个答案:

答案 0 :(得分:2)

您可以cumsum groupby months使用sum,然后按照month的索引值进行分组:

df.Date = pd.to_datetime(df.Date)
df = df.groupby('Date').Amount.sum()
df = df.groupby(df.index.month).cumsum().reset_index()
print (df)

        Date  Amount
0 2017-01-12      80
1 2017-01-15     150
2 2017-01-23     230
3 2017-02-01     100
4 2017-02-02     110
5 2017-02-03     140
6 2017-02-04     390

但如果需要,months and years需要按to_period转换为月期:

df = df.groupby(df.index.to_period('m')).cumsum().reset_index()

在更改的df中可以更好地看到差异 - 添加了不同的年份:

print (df)
          Date  Amount
0   2017/01/12      50
1   2017/01/12      30
2   2017/01/15      70
3   2017/01/23      80
4   2017/02/01      90
5   2017/02/01      10
6   2017/02/02      10
7   2017/02/03      10
8   2018/02/03      20
9   2018/02/04      60
10  2018/02/04      90
11  2018/02/04     100

df.Date = pd.to_datetime(df.Date)
df = df.groupby('Date').Amount.sum()
df = df.groupby(df.index.month).cumsum().reset_index()
print (df)
        Date  Amount
0 2017-01-12      80
1 2017-01-15     150
2 2017-01-23     230
3 2017-02-01     100
4 2017-02-02     110
5 2017-02-03     120
6 2018-02-03     140
7 2018-02-04     390
df.Date = pd.to_datetime(df.Date)
df = df.groupby('Date').Amount.sum()
df = df.groupby(df.index.to_period('m')).cumsum().reset_index()
print (df)
        Date  Amount
0 2017-01-12      80
1 2017-01-15     150
2 2017-01-23     230
3 2017-02-01     100
4 2017-02-02     110
5 2017-02-03     120
6 2018-02-03      20
7 2018-02-04     270