在 pandas 中的每个新月开始时重置为零的累计月度总和

Cumulative monthly sum with reset to zero at the beginning of each new month in pandas

我有一个包含每日数据的 pandas 数据框

Date          Value
2020-01-01    1780.2
2020-01-02    1783.3
2020-01-05    1781.5
...
2020-02-01    1816.0
2020-02-02    1810.4
...

一个月中的每一天并不总是一个值,所以有些日子可能会丢失,因此时间增量并不总是 1 天。

我想做的是简单地在每个月内取一个累计总和,然后在下月初将总和重置为零,所以结果如下所示

Date          Value    Cumulative Value
2020-01-01    1780.2   1780.2
2020-01-02    1783.3   3563.5
2020-01-05    1781.5   5345.0
...
2020-02-01    1816.0   1816.0
2020-02-02    1810.4   3626.4
...

我找到了 ,它解释了如何按月计算累计金额。但我需要的是在每个月初将累计总和重置为零。我该怎么做?

解决方案,如果多年按月分组Series.dt.to_period

df['Cumulative Value'] = df.groupby(df['Date'].dt.to_period('m'))['Value'].cumsum()

解决方案如果只有一年是可能的使用Series.dt.month:

df['Cumulative Value'] = df.groupby(df['Date'].dt.month)['Value'].cumsum() 

累积总和默认重置为0,因此无需为此添加代码。

groupy() 提取的月份,transform('cumsum')

 df['Cumulative Value']=df.groupby(pd.to_datetime(df.Date).dt.month).transform('cumsum')



     Date         Value        Cumulative Value
0  2020-01-01  1780.2            1780.2
1  2020-01-02  1783.3            3563.5
2  2020-01-05  1781.5            5345.0
3  2020-02-01  1816.0            1816.0
4  2020-02-02  1810.4            3626.4
import pandas as pd
start='2020-01-01' 
end='2020-12-31'
df = pd.DataFrame({"Date": pd.date_range(start, end)})
df['qty']=1
df = df.groupby('Date').qty.sum()
print(df.head())
df=df.groupby(df.index.month).cumsum().reset_index()
print(df.head(45))

输出:

Date
2020-01-01    1
2020-01-02    1
2020-01-03    1
2020-01-04    1
2020-01-05    1
Name: qty, dtype: int64
         Date  qty
0  2020-01-01    1
1  2020-01-02    2
2  2020-01-03    3
3  2020-01-04    4
4  2020-01-05    5
5  2020-01-06    6
6  2020-01-07    7
7  2020-01-08    8
8  2020-01-09    9
9  2020-01-10   10
10 2020-01-11   11
11 2020-01-12   12
12 2020-01-13   13
13 2020-01-14   14
14 2020-01-15   15
15 2020-01-16   16
16 2020-01-17   17
17 2020-01-18   18
18 2020-01-19   19
19 2020-01-20   20
20 2020-01-21   21
21 2020-01-22   22
22 2020-01-23   23
23 2020-01-24   24
24 2020-01-25   25
25 2020-01-26   26
26 2020-01-27   27
27 2020-01-28   28
28 2020-01-29   29
29 2020-01-30   30
30 2020-01-31   31
31 2020-02-01    1
32 2020-02-02    2
33 2020-02-03    3
34 2020-02-04    4
35 2020-02-05    5
36 2020-02-06    6
37 2020-02-07    7
38 2020-02-08    8
39 2020-02-09    9
40 2020-02-10   10
41 2020-02-11   11
42 2020-02-12   12
43 2020-02-13   13
44 2020-02-14   14

我假设 Date 列是 datetime 类型。如果不是,请转换它。

据我了解,您不仅希望按月分组(例如放在一起 1 月、2 月等所有年份的数据(如其他 2 个 答案)),但分组应按 年和月 (你想要 从 0 下月初 ).

要以这种方式计算新列,运行:

df['Cumulative Value'] = df.groupby(pd.Grouper(key='Date', freq='M')).Value.cumsum()

您的数据样本的结果是:

        Date   Value  Cumulative Value
0 2020-01-01  1780.2            1780.2
1 2020-01-02  1783.3            3563.5
2 2020-01-05  1781.5            5345.0
3 2020-02-01  1816.0            1816.0
4 2020-02-02  1810.4            3626.4