我有一个示例数据框(日期为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
从每月的第一天到第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-01-01创建的,但它排在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
因为31st不在任何范围内,所以没有耕种日期
我已经尝试了很多,但是对我来说没有用。因此,寻求您的帮助。
预先感谢!
答案 0 :(得分:3)
方法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