如何获取到特定日期之前的熊猫数据

时间:2020-10-02 17:47:24

标签: python pandas dataframe

我有一个示例数据框(日期为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不在任何范围内,所以没有耕种日期

我已经尝试了很多,但是对我来说没有用。因此,寻求您的帮助。

预先感谢!

1 个答案:

答案 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