大熊猫从时间序列索引中同时切片多个窗口

时间:2019-03-13 11:08:48

标签: python pandas datetime time-series

我有一个脚本,该脚本生成包含日期“块”的数据帧并将其存储在变量“ cur_blocks”中,例如:

                  year      start        end       date
gmt_reportedtime                                       
2019-03-11        2000 2000-01-09 2000-03-10 2019-03-11
2019-03-11        2001 2001-01-09 2001-03-10 2019-03-11
2019-03-11        2002 2002-01-09 2002-03-10 2019-03-11
2019-03-11        2003 2003-01-09 2003-03-10 2019-03-11
2019-03-11        2004 2004-01-09 2004-03-10 2019-03-11

我还有另一个在日期时间索引的数据帧“ col”,其中包含我想进行下游计算(例如排名和z得分)的数据。我想使用“ cur_blocks”的“ start”和“ end”中表示的块对col的多个块进行切片。 “ cur_blocks”中的日期块是60天的窗口,每个窗口在2000-2019年之间间隔1年。

这里是'col':

              X
2000-01-01   24
2000-01-02   90
2000-01-03   62
2000-01-04   10
...
2019-02-28   73
2019-03-01   96

[7000 rows x 1 columns]

到目前为止,我已经这样解决了它:

window_aggregate = pd.DataFrame()
for index, block in cur_blocks.iterrows():
    dt_block = col.loc[block['start']:block['end']]
    window_aggregate = pd.concat([window_aggregate, dt_block])

然后我可以使用'window_aggregate'进行下游工作。这行得通,但是它非常慢,因为会为2000年1月1日至今天之间的每个日期生成“ cur_blocks”。

我很惊讶熊猫没有内置功能来做这种事情?除非我错过了?但是另一位处于堆栈溢出状态的用户也提出了类似的问题,到目前为止尚未得到解答here

我最近发布了一个问题,详细介绍了更广泛的问题here,尽管我编写的代码主要解决了该问题,但对于实际应用而言,它太慢了。

我已经看到它在几年here中解决了一天,但没有窗口。

可能有解决方法here,但我不知道如何将答案应用于我的数据

编辑:显示所需的输出,如下所示,数据框中的日期与cur_blocks中的开始和结束块相对应

所需的输出

              X
2000-01-09   24
2000-01-10   90
...
2000-03-10   62
2001-01-09   10
2001-01-10   10
...
2001-03-10   10
2002-01-09   10
...
...
...
2004-03-10   73

1 个答案:

答案 0 :(得分:0)

我会在一年中合并两个数据框。然后,您可以简单地用行来过滤结果数据帧,其中行col的日期在startend日期之间。在合并所需的各种索引操作和最终的列选择之后,它给出:

pd.DataFrame(pd.concat([col, pd.Series(col.index.year,
                       index=col.index, name='year')],axis=1)
         .rename_axis('dat').reset_index().merge(cur_blocks, on='year')
         .query('(start <= dat) & (dat <= end)').set_index('dat')
         .rename_axis('')['X'])