2017-06-22 53 views
0

说我得到了与覆盖在当前财政年度的最后一个财政年度,有一天一个日期索引数据帧(从4月1日):如何从熊猫的时间序列的最后四个完整季度中选择数据?

  Units 
date 
2016-01-01 8734 
2016-06-30 6120 
2016-09-30 7346 
2016-12-31 5925 
2016-03-31 7542 
2016-06-30 9916 
2016-09-30 9547 
2016-12-31 8063 
2017-01-01 7000 
2017-03-31 5672 
2017-04-01 7856 

我希望能够选择最后四个季度的数据 - 在这种情况下忽略了第一行和最后一行。

我知道我可以用切片做到这一点,即:

df["2016-04-01":"2017-03-31"] 

什么是最优雅 - Python的 - 解决方案根据最后四个完整的编程季度对数据进行筛选?

+0

我想你可以这样做,'df.date> =“2016-04-01”&df.date <“2017-03-31”' – mtkilic

+0

对不起,我不得不调整这个问题。我的意思是编程方式,因为我非常想留下脚本,我不想每次调整。 – elksie5000

+0

您的意思是只考虑01-01至03-31的时间段; 04-01至06-31; 07-01至09-31和10-01至12-31作为宿舍,还是根据你的数据,你想要改变'宿舍'?除非你精确地定义你期望的东西(或者'四分之一'是多久,相信我,可以改变!)这是一个算法问题,而不是熊猫或python问题。 – vmg

回答

2

你应该先定义你的宿舍。您可以使用pd.period_range为用正确的频率: 例如:

quarters = pd.period_range('2016Q1', '2017Q1', freq='Q-MAR') 

这会给你一个PeriodIndex上,你可以改变频率来得到你想要的日期与asfreq

quarters.asfreq('D', 'E') 

这会给你PeriodIndex,你可以使用切片索引。

以下是documentation中的更多示例。

+0

感谢您的帮助和指向DateOffset的东西。我已经发布了一个基于它的解决方案。 – elksie5000

0

使用Alex的指针DateOffset功能在熊猫我发现的部分解决方案,以及datetime模块:

import datetime 
from pandas.tseries.offsets import * 
now = datetime.datetime.now() 
start_year = (now - BQuarterEnd(n=1) - (12 * MonthBegin())).to_datetime() 
end_year = (now - BQuarterEnd(n=1)).to_datetime() 
df[start_year.strftime("%Y-%m-%d") : end_year.strftime("%Y-%m-%d")] 
相关问题