如何获得Pandas中特定日期前的数据总和

2024-06-16 07:30:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个示例数据框(日期为YYYY-MM-DD格式)

Region  Area  Hq   Sales  Date               monthyear
  R1     A1   H1   1000   2020-01-01           202001
  R1     A1   H1   2000   2020-01-05           202001
  R1     A1   H1   1500   2020-01-09           202001
  R1     A1   H1   2000   2020-01-12           202001
  R1     A1   H1   2000   2020-01-17           202001
  R1     A1   H1   1300   2020-01-21           202001
  R1     A1   H1   1000   2020-01-23           202001
  R1     A1   H1   5000   2020-01-27           202001

从月1日到月9日,应计算总销售额

从每月10日到18日,应计算总销售额

从每月19日到24日,应计算总销售额

从每月25日到28日,应计算总销售额

所需输出:

Region    Area  Hq    Sales    till_date    month_year
 R1        A1   H1     4500       9th          202001
 R1        A1   H1     4000       18th         202001
 R1        A1   H1     2300       24th         202001
 R1        A1   H1     5000       28th         202001

如您所见,我们没有2020-01-10,但我们从2020-01-10到2020-01-18的范围。所以我们选择的是属于这个范围的第12个、第17个。其他的也一样

另一个示例(仅一条记录)

Region   Area    Hq    Sales    Date          monthyear
H1        A1     H1    1000     2020-01-01     202001

期望输出

Region  Area    Hq     Sales     till_date      monthyear
 H1       A1    H1     1000      2020-01-09       202001

结果出来之前,销售额是在2020年1月1日创造的,但在第1-9日下降

日期范围,截止日期为2020-01-09

补充说明:

Region  Area   Hq    Sales     Date         monthyear
 H1     A1     H1    2000     2020-01-31      202001

期望输出:

Region Area   Hq      Sales    till_date   monthyear
 H1     A1    H1        0       NaN           202001

因为31号不在任何范围内,所以没有截止日期

我已经试了很多次了,但是没有成功。所以我在寻找你的帮助

提前谢谢


Tags: 数据示例datea1areah1regionsales
1条回答
网友
1楼 · 发布于 2024-06-16 07:30:16

方法1

使用.asfreq添加所有缺少的日期,并使用.isin创建与groupby.sum一起使用的掩码

a = np.array([1,10,19,25])
df1 = df.set_index('Date').asfreq('D')
m = df1.index.day.isin(a).cumsum()

df_final = df1.groupby(['Region', 'Area', 'Hq', m]).Sales.sum().droplevel(-1).reset_index()

Out[69]:
  Region Area  Hq   Sales
0     R1   A1  H1  4500.0
1     R1   A1  H1  4000.0
2     R1   A1  H1  2300.0
3     R1   A1  H1  5000.0

方法2

另一种方法是使用pd.cut为groupby创建掩码

m = pd.cut(df.Date.dt.day, bins=[1,10,19,25,31], right=False)

df_final = (df.groupby(['Region', 'Area', 'Hq', m]).agg({'Date': 'last', 'Sales': 'sum'})
                                                   .droplevel(-1)
                                                   .reset_index())

Out[85]:
  Region Area  Hq       Date  Sales
0     R1   A1  H1 2020-01-09   4500
1     R1   A1  H1 2020-01-17   4000
2     R1   A1  H1 2020-01-23   2300
3     R1   A1  H1 2020-01-27   5000

相关问题 更多 >