【发布时间】:2019-08-04 01:06:19
【问题描述】:
我有一个脚本,它生成包含日期“块”的数据帧并将它们存储在变量“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”进行下游工作。这可行,但是速度很慢,因为 'cur_blocks' 是为 2000-01-01 和今天之间的每个日期生成的。
我很惊讶 pandas 中没有内置函数来做这种事情?除非我错过了?但是另一个堆栈溢出的用户也提出了一个类似的问题,到目前为止还没有回答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
【问题讨论】:
-
为什么会为每个日期生成
cur_blocks?它应该逐行应用您创建的窗口。也有助于显示您想要的输出。 -
我在创建
for循环时遇到错误,但如果您将该行和以下内容替换为:for index, block in cur_blocks.iterrows(): df = col[(col.index > block['start']) & (col.index < block['end'])],则工作正常 -
刚刚注意到循环错误elPastor,现在更新了。
-
所以 cur_clocks 中的开始和结束列对于每个日期都有不同的值 - 当日期列在 1 天后时,开始和结束列中的所有值也将在一天后 - 我可以t 简单地为每一天使用相同的日期块
-
帮助您的部分问题是您对“日期”和“日期”的使用令人困惑,并且似乎可以互换。最好引用实际的列名。
标签: python pandas datetime time-series