首页 > 解决方案 > 如何在熊猫中获取特定日期之前的数据总和

问题描述

我有一个示例数据框(日期为 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-18th 范围。所以我们选择了第 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-01-01 创建的,但它在 1-9th

日期范围,till_date 是 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

因为 31st 不在任何范围内,所以没有 till_date

我已经尝试了很多,但对我来说没有成功。所以寻求你的帮助。

提前致谢!

标签: pythonpandasdataframe

解决方案


方法一

用于.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

方法二

另一种方法是使用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

推荐阅读