使用分组依据扩展索引日期

2024-06-28 19:06:00 发布

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

我有一系列类似于此表的事务:

ID  Customer    Date    Amount
1   A        6/12/2018  33,223.00
2   A        9/20/2018  635.00
3   B        8/3/2018   8,643.00
4   B        8/30/2018  1,231.00
5   C        5/29/2018  7,522.00

不过,我需要得到过去六个月的平均金额(截至今天)

我用的是

df.groupby('Customer').resample('W')['Amount'].sum()

得到这样的结果:

CustomerCode  PayDate   
A             2018-05-21                    268
              2018-05-28                   0.00
              2018-06-11                   0.00
              2018-06-18                472,657
              2018-06-25                   0.00

然而,使用这个解决方案,我只能得到客户有金额的日期范围。我需要延长每个客户的周数,这样我就可以得到六个月的整个范围(以周为单位)。在本例中,我需要为客户A获取从“2018-04-05”这一周(从今天算起正好是六个月前)到今天这一周的数据(因为没有金额,所以当然填0)


Tags: iddfdate客户customer解决方案事务金额
2条回答

重采样非常灵活。要获得6个月的金额而不是当前的周金额,您需要的是:

df.groupby('Customer').resample('6M')['Amount'].sum()

月底分组;月初为'6MS'。你知道吗

有关可用频率的更多文档,请参见: http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases

这是我找到的解决问题的办法。首先,我创建我想要的日期(过去六个月,但以周为单位)

dates = pd.date_range(datetime.date.today() - datetime.timedelta(6*365/12),
                      pd.datetime.today(),
                      freq='W')

然后我使用客户的产品和日期创建一个多索引。你知道吗

multi_index = pd.MultiIndex.from_product([pd.Index(df['Customer'].unique()), 
                                          dates], 
                                         names=('Customer', 'Date'))

然后,我使用新创建的多索引重新索引df,最后,用零填充缺少的值。你知道吗

df.reindex(multi_index)
df.fillna(0)

相关问题 更多 >