熊猫上采样将多索引每月数据重新采样为多索引每周数据?

时间:2020-05-04 05:16:44

标签: python pandas pandas-groupby

我在一个看起来像这样的DataFrame中拥有2年的数据:

In[117]: df
Out[117]: 
                               Str%      Val%      Vol%
State Location Date                                    
NSW   Country  2018-01-01  0.043152  0.052147  0.052867
               2018-02-01  0.043233  0.050797  0.050907
               2018-03-01  0.045113  0.052550  0.052213
               2018-04-01  0.045113  0.052237  0.052195
               2018-05-01  0.045198  0.050020  0.049767
                             ...       ...       ...
WA    Metro    2019-09-01  0.028958  0.025970  0.027752
               2019-10-01  0.029070  0.025906  0.028062
               2019-11-01  0.029126  0.024388  0.026421
               2019-12-01  0.029126  0.021167  0.023982
               2020-01-01  0.029412  0.027437  0.029197

[300 rows x 3 columns]

数据具有三个多索引['State', 'Location', 'Date']。对于每个位置,该数据每月都可用。但是,我想将其转换为每个州和每个位置的每周级别。如下,

In[119]: df
Out[119]: 
                               Str%      Val%      Vol%
State Location Date                                    
NSW   Country  2018-01-07  0.043152  0.052147  0.052867
               2018-01-14  0.043152  0.052147  0.052867
               2018-01-21  0.043152  0.052147  0.052867
               2018-01-28  0.043152  0.052147  0.052867
               2018-02-04  0.043233  0.050797  0.050907

到目前为止,我已经尝试使用pandas的 resample()函数,但是它拒绝使用多索引对象。此外,如果我从索引中删除了State和Location,那么我的Date索引中有重复的条目,这再次破坏了 resample()函数。我还尝试在groupby()函数中使用“ Grouper”,如下所示:

df= df.reset_index()
Weekly = pd.Grouper(key='Date', freq='W-SUN', closed='left', label='right')
df.groupby(['State', 'Location', Weekly]).first()

这将产生以下输出

Out[121]: 
                               Str%      Val%      Vol%
State Location Date                                    
NSW   Country  2018-01-07  0.043152  0.052147  0.052867
               2018-02-04  0.043233  0.050797  0.050907
               2018-03-04  0.045113  0.052550  0.052213
               2018-04-08  0.045113  0.052237  0.052195
               2018-05-06  0.045198  0.050020  0.049767

如您所见,这只会将当前日期转换为星期开始,而不会插补每个月的缺失星期。

对此有任何帮助吗?

1 个答案:

答案 0 :(得分:1)

它看到有每月数据。通过DataFrameGroupBy.resample更改了解决方案,以进行链式分组并一起重新采样:

df1 = (df.reset_index(level=[0,1])
         .groupby(['State', 'Location'])
         .resample('W-SUN', closed='left', label='right')
         .first())

print (df1)

                          State Location      Str%      Val%      Vol%
State Location Date                                                   
NSW   Country  2018-01-07   NSW  Country  0.043152  0.052147  0.052867
               2018-01-14   NaN      NaN       NaN       NaN       NaN
               2018-01-21   NaN      NaN       NaN       NaN       NaN
               2018-01-28   NaN      NaN       NaN       NaN       NaN
               2018-02-04   NSW  Country  0.043233  0.050797  0.050907
               2018-02-11   NaN      NaN       NaN       NaN       NaN
               2018-02-18   NaN      NaN       NaN       NaN       NaN
               2018-02-25   NaN      NaN       NaN       NaN       NaN
               2018-03-04   NSW  Country  0.045113  0.052550  0.052213
               2018-03-11   NaN      NaN       NaN       NaN       NaN
               2018-03-18   NaN      NaN       NaN       NaN       NaN
               2018-03-25   NaN      NaN       NaN       NaN       NaN
               2018-04-01   NaN      NaN       NaN       NaN       NaN
               2018-04-08   NSW  Country  0.045113  0.052237  0.052195
               2018-04-15   NaN      NaN       NaN       NaN       NaN
               2018-04-22   NaN      NaN       NaN       NaN       NaN
               2018-04-29   NaN      NaN       NaN       NaN       NaN
               2018-05-06   NSW  Country  0.045198  0.050020  0.049767
WA    Metro    2019-09-08    WA    Metro  0.028958  0.025970  0.027752
               2019-09-15   NaN      NaN       NaN       NaN       NaN
               2019-09-22   NaN      NaN       NaN       NaN       NaN
               2019-09-29   NaN      NaN       NaN       NaN       NaN
               2019-10-06    WA    Metro  0.029070  0.025906  0.028062
               2019-10-13   NaN      NaN       NaN       NaN       NaN
               2019-10-20   NaN      NaN       NaN       NaN       NaN
               2019-10-27   NaN      NaN       NaN       NaN       NaN
               2019-11-03    WA    Metro  0.029126  0.024388  0.026421
               2019-11-10   NaN      NaN       NaN       NaN       NaN
               2019-11-17   NaN      NaN       NaN       NaN       NaN
               2019-11-24   NaN      NaN       NaN       NaN       NaN
               2019-12-01   NaN      NaN       NaN       NaN       NaN
               2019-12-08    WA    Metro  0.029126  0.021167  0.023982
               2019-12-15   NaN      NaN       NaN       NaN       NaN
               2019-12-22   NaN      NaN       NaN       NaN       NaN
               2019-12-29   NaN      NaN       NaN       NaN       NaN
               2020-01-05    WA    Metro  0.029412  0.027437  0.029197