2017-06-06 73 views
1

我有一个很长的时间序列,以下列数据结束。熊猫重新采样到现有索引

   ABC  CDE 
Date      
2017-05-26 107.00 241.71 
2017-05-30 107.27 241.50 
2017-05-31 107.32 241.44 
2017-06-01 107.10 243.36 
2017-06-02 107.57 244.17 

我想重新取样,使之成为月度数据,但我感兴趣的保留时间序列实际每月最后日期。如果我这样做,

df.resample('BM').last() 

提供了以下尾端输出

2017-05-31 107.32 241.44 
2017-06-30 107.57 244.17 

不给数据框的正确的最后日期。重采样数据帧中还有其他日期也是关闭的。本质上熊猫没有使用现有的索引来查找月末,但它是自己的工作日历。

是否有一个选项,我可以喂到大熊猫重采样功能,以便它使用现有的索引来达到预期的效果是

2017-05-31 107.32 241.44 
2017-06-02 107.57 244.17 

回答

1

您需要创建新的索引列,最后set_index

df = df.assign(Date=df.index).resample('BM').last().set_index('Date') 
print (df) 
       ABC  CDE 
Date      
2017-05-31 107.32 241.44 
2017-06-02 107.57 244.17 

但如果需要重采样仅一个月期限:

m = df.index.to_period('m') 
df = df.reset_index().groupby(m).last().set_index('Date') 
print (df) 
       ABC  CDE 
Date      
2017-05-31 107.32 241.44 
2017-06-02 107.57 244.17 
+0

谢谢您的回答。你能否进一步澄清你的上述方法之间的差异? – Spinor8

+0

首先按工作月份重新抽样,第二次按月抽查 – jezrael

0

可以删除基于年份和月份重复,只保留最后一行。

df.assign(m=df.index.to_period('m')).drop_duplicates('m','last').drop('m',1) 
Out[728]: 
       ABC  CDE 
Date      
2017-05-31 107.32 241.44 
2017-06-02 107.57 244.17 

或者您可以按年份和月份使用组,然后从每组中选取最后一行。

df.reset_index()\ 
    .sort_values('Date')\ 
    .assign(m=df.index.to_period('m'))\ 
    .groupby(by='m')\ 
    .last()\ 
    .set_index('Date') 
Out[677]: 
       ABC  CDE 
Date      
2017-05-31 107.32 241.44 
2017-06-02 107.57 244.17