You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多变量时间序列DataFrame按20秒窗口分组适配sktime

为sktime和MiniRocket准备时间序列分类数据

目标

我正尝试为基于sktime和MiniRocket的时间序列分类准备数据,分类将基于20秒的时间窗口进行。数据需要以多层索引(MultiIndex)的pandas DataFrame形式提供给MiniRocket,示例如下:

id   name    20_s_window
1    A       0.469112 0.684662 1.462547
     B      -0.282863 ...
2    A      -1.509059 ... 
     B      -1.135632 ...
3    A       1.212112 ...
     B      -0.173215 ...
4    A       0.119209 ...
     B      -1.044236 ...

每个“id”行代表20秒的数据。

但我当前的DataFrame格式如下:

A          B
1    0.469112   -0.282863
2    0.684662   ...

其中A的所有数据在同一列,以此类推,行索引为毫秒级时间。

已尝试方案

我最接近预期结果的代码如下:

df["timestamp"] = pd.to_datetime(df.index, unit="ms")
df_transpose = df.groupby(pd.Grouper(key="timestamp", freq="20s")).apply(
    lambda x: [x[track].tolist() for track in df.columns]
)

得到的结果为:

timestamp
1970-01-01 00:05:00    [[69.19940185546875, 68.21199798583984, 68.211...
1970-01-01 00:05:20    [[82.0363998413086, 81.04889678955078, 79.0739...
1970-01-01 00:05:40    [[67.22450256347656, 67.22450256347656, 67.224...
1970-01-01 00:06:00    [[62.287200927734375, 63.27470016479492, 62.28...

问题在于所有列的数据都被放到同一行的列表中,而非拥有独立的索引。

我还尝试先创建多层索引DataFrame:

col = ["A", "B"]
indexes = list(range(10))
iterables = [indexes, col]
df = pd.MultiIndex.from_product(iterables, names=["col", "index"])

得到的对象如下:

MultiIndex([(0, 'A'),
            (0, 'B'),
            (1, 'A'),
            (1, 'B'),
            (2, 'A'),
            (2, 'B'),
            (3, 'A'),
            (3, 'B'),
            (4, 'A'),
            (4, 'B')],
           names=['col', 'index'])

但我不知道如何将原始DataFrame的数据填入其中。

可复现示例

数据代码:

import pandas as pd

tracks = ["A", "B", "C"]
values = [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
df = pd.DataFrame(values, columns=tracks)

df["timestamp"] = pd.to_datetime(df.index, unit="s")
grouper = pd.Grouper(key="timestamp", freq="2s")
df_transpose = df.groupby(grouper).apply(
    lambda x: [x[track].tolist() for track in df.columns if track != "timestamp"]
)

我希望将该DataFrame按2行的窗口分组,目标格式如下:

id name values
1  A    1  2
1  B    5  6
1  C    9  10
2  A    3  4
2  B    7  8
2  C    11 12

但实际得到的是:

id
1970-01-01 00:00:00    [[1, 2], [5, 6], [9, 10]]
1970-01-01 00:00:02    [[3, 4], [7, 8], [11, 12]]

请问是否有方法实现目标格式?

最终解决方案

后续发现之前误解了sktime的输入结构,使用以下代码得到了符合要求的格式:

df["timestamp"] = pd.to_datetime(df.index, unit="ms")
grouper = pd.Grouper(key="timestamp", freq="20s")
out = (
    df.assign(
        window=(g := df.groupby(grouper)).ngroup().add(1), row=g.cumcount().add(1)
    )
    .drop(columns="timestamp")
    .set_index(["window", "row"])
)

最终得到的格式如下:

A  B   C
window row          
1      1    1  5   9
       2    2  6  10
2      1    3  7  11
       2    4  8  12

内容的提问来源于stack exchange,提问作者Côme Vincent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:15:34