【问题标题】:Split dataframe column values into windows of size n with overlap and keep date information将数据框列值拆分为大小为 n 且具有重叠的窗口并保留日期信息
【发布时间】:2021-11-11 07:23:19
【问题描述】:

当前df:

Date                 Power
2011-04-18 17:00:01  245.83
2011-04-18 17:00:02  246.02
2011-04-18 17:00:03  245.72
2011-04-18 17:00:04  244.71
2011-04-18 17:00:05  245.93
2011-04-18 17:00:06  243.12
2011-04-18 17:00:07  244.72
2011-04-18 17:00:08  242.44
2011-04-18 17:00:09  246.42
2011-04-18 17:00:10  245.02
...                     ...

我想将上述数据框拆分为大小为 n=4(大小可变)和 o=75 重叠的窗口。这意味着 75% 的窗口将在前一个窗口和下一个窗口之间共享。在这个例子中,由于 n=4 的 75% 是 3,我希望窗口每 1 秒向右滑动一次(3 秒将是常见的重叠或 75%)。我想创建以下df。

     date start          date end            power
0    2011-04-18 17:00:01 2011-04-18 17:00:04 [245.83, 246.02, 245.72, 244.71]
1    2011-04-18 17:00:02 2011-04-18 17:00:05 [246.02, 245.72, 244.71, 245.93]
2    2011-04-18 17:00:03 2011-04-18 17:00:06 [245.72, 244.71, 245.93, 243.12]
3    2011-04-18 17:00:04 2011-04-18 17:00:07 [244.71, 245.93, 243.12, 244.72]
4    2011-04-18 17:00:05 2011-04-18 17:00:08 [245.93, 243.12, 244.72, 242.44]
5    2011-04-18 17:00:06 2011-04-18 17:00:09 [243.12, 244.72, 242.44, 246.42]
6    2011-04-18 17:00:07 2011-04-18 17:00:10 [244.72, 242.44, 246.42, 245.02]
...                  ...                 ...                              ...

pandas 中是否有任何功能可以让您做到这一点?我搜索了文档,但找不到任何可以达到此目的的内容。

我能够使用以下方法将我的数据框变成大小为 n 的窗口,但我很难让窗口重叠。

def make_row(d):
    return pd.Series({"date_start":d["Date"].min(), "date_end":d["Date"].max(), "power":d["Power"].to_list()})

df.groupby(np.floor(np.linspace(0,len(df)-1,len(df))/n)).apply(make_row).index.astype(int)

供参考,以上代码结果:

     date_start          date_end            power
0    2011-04-18 17:00:01 2011-04-18 17:00:04 [245.83, 246.02, 245.72, 244.71]
1    2011-04-18 17:00:05 2011-04-18 17:00:08 [245.93, 243.12, 244.72, 242.44]
...                  ...                 ...                              ...

【问题讨论】:

  • 日期是否总是增加 1 秒?这将大大简化问题

标签: python pandas dataframe date datetime


【解决方案1】:

试一试,如果它符合您的预期,我将在编辑中充实说明。

设置

n = 4
o = 50

解决方案

shift = int(n*(1-o/100))
power_shifted = np.stack([df["Power"].shift(x).iloc[::shift] for x in range(0,-n,-1)])
power_lists = pd.DataFrame(power_shifted).transpose().apply(pd.Series.to_list, axis=1).values

result = pd.DataFrame(
    {
        "date_start":df["Date"].iloc[::shift],
        "date_end":df["Date"].shift(-n+1).iloc[::shift],
        "power":power_lists,
    }
)

【讨论】:

    猜你喜欢
    • 2021-12-16
    • 2017-05-20
    • 2021-05-20
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多