【问题标题】:pandas slice multiple windows simultaneously from time series indexpandas 从时间序列索引同时切片多个窗口
【发布时间】: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


【解决方案1】:

我会在一年内合并两个数据框。然后,您可以简单地过滤结果数据帧,其中包含来自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'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 2018-08-10
    • 2015-03-16
    • 2019-07-08
    • 2021-08-25
    • 1970-01-01
    • 2015-06-09
    • 2020-01-12
    相关资源
    最近更新 更多