我有一个脚本,该脚本生成包含日期“块”的数据帧并将其存储在变量“ 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
答案 0 :(得分:0)
我会在一年中合并两个数据框。然后,您可以简单地用行来过滤结果数据帧,其中行col
的日期在start
和end
日期之间。在合并所需的各种索引操作和最终的列选择之后,它给出:
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'])