如何在熊猫中迭代时间段

twi*_*cki 7 python pandas

考虑我有一个熊猫SeriesDatetimeIndex日常的频率.我想Series用任意频率和任意的回顾窗口迭代它.例如:使用1y的回顾窗口每半年迭代一次.

这样的事情是理想的:

for df_year in df.timegroup(freq='6m', lookback='1y'):
   # df_year will span one year of daily prices and be generated every 6 months
Run Code Online (Sandbox Code Playgroud)

我知道,TimeGrouper但还没弄明白它怎么能做到这一点.无论如何,我可以手动编码,但希望有一个聪明pandas的单行.

编辑:这有点接近:

pd.rolling_apply(df, 252, lambda s: s.sum(), freq=pd.datetools.BMonthEnd())
Run Code Online (Sandbox Code Playgroud)

这不太有效,因为它应用252*BMonthEnd()的回顾窗口,而我希望它是独立的,并且每个月末都有252 的回顾窗口.

Jef*_*eff 4

我想这就是你正在寻找的

构建一系列频率。此处使用 1 进行澄清。

In [77]: i = pd.date_range('20110101','20150101',freq='B')

In [78]: s = Series(1,index=i)

In [79]: s
Out[79]: 
2011-01-03    1
2011-01-04    1
2011-01-05    1
2011-01-06    1
2011-01-07    1
             ..
2014-12-26    1
2014-12-29    1
2014-12-30    1
2014-12-31    1
2015-01-01    1
Freq: B, dtype: int64

In [80]: len(s)
Out[80]: 1044
Run Code Online (Sandbox Code Playgroud)

使索引符合另一个频率。这使得每个索引元素都是月底。

In [81]: s.index = s.index.to_period('M').to_timestamp('M')

In [82]: s
Out[82]: 
2011-01-31    1
2011-01-31    1
2011-01-31    1
2011-01-31    1
2011-01-31    1
             ..
2014-12-31    1
2014-12-31    1
2014-12-31    1
2014-12-31    1
2015-01-31    1
dtype: int64
Run Code Online (Sandbox Code Playgroud)

然后可以直接重新采样到另一个频率。在这种情况下,这将为您提供该期间的工作日数。

In [83]: s.resample('3M',how='sum')
Out[83]: 
2011-01-31    21
2011-04-30    64
2011-07-31    65
2011-10-31    66
2012-01-31    66
              ..
2014-01-31    66
2014-04-30    63
2014-07-31    66
2014-10-31    66
2015-01-31    44
Freq: 3M, dtype: int64
Run Code Online (Sandbox Code Playgroud)