极坐标中的 group_by id 和时间戳(时间戳阈值 45 分钟)

问题描述 投票:0回答:1

我有一个带有“col1”列和“col2”列的极坐标数据框。 现在我想对两列进行分组并创建一个新列。我有以下示例数据:

data = {
    "col1": [1, 1, 1,1,1,1,1,1,1,1,1,1, 2, 2,2,2,2,2,2,2,2,2,2],
    "col2": [
        "2022-05-25T08:00:00.648681",
        "2022-05-25T08:15:00.648681",
        "2022-05-25T08:30:00.648681",
        "2022-05-25T08:45:00.648681",
        "2022-05-25T09:00:00.648681",
        "2022-05-25T09:15:00.648681",
        "2022-05-25T09:30:00.648681",
        "2022-05-25T09:45:00.648681",
        "2022-05-25T10:00:00.648681",
        "2022-05-25T10:15:00.648681",
        "2022-05-25T10:30:00.648681",
        "2022-05-25T10:45:00.648681",
        "2022-05-25T08:00:00.648681",
        "2022-05-25T08:15:00.648681",
        "2022-05-25T08:30:00.648681",
        "2022-05-25T08:45:00.648681",
        "2022-05-25T09:00:00.648681",
        "2022-05-25T06:00:00.648681",
        "2022-05-25T06:15:00.648681",
        "2022-05-25T06:30:00.648681",
        "2022-05-25T06:45:00.648681",
        "2022-05-25T07:00:00.648681",
        "2022-05-25T07:15:00.648681",
    ],
}

# Create a DataFrame from the dictionary
df = pl.DataFrame(data)
df = df.with_columns(pl.col("col2").str.to_datetime())

现在我想创建列“col3”,其中“col1”和“col2”按 45 分钟的阈值进行分组。例如,如果 col1 = 1 且 col2 = 在 45 分钟内,则将 col3 的值设置为 1。如果 col1 = 1 且 col2 = 在下一个 45 分钟内,则将 col3 的值设置为 2

所以期望的结果应该是这样的:

┌──────┬────────────────────────────┬──────┐
│ col1 ┆ col2                       ┆ col3 │
│ ---  ┆ ---                        ┆ ---  │
│ i64  ┆ datetime[μs]               ┆ u32  │
╞══════╪════════════════════════════╪══════╡
│ 1    ┆ 2022-05-25 08:00:00.648681 ┆ 1    │
│ 1    ┆ 2022-05-25 08:15:00.648681 ┆ 1    │
│ 1    ┆ 2022-05-25 08:30:00.648681 ┆ 1    │
│ 1    ┆ 2022-05-25 08:45:00.648681 ┆ 1    │
│ 1    ┆ 2022-05-25 09:00:00.648681 ┆ 2    │
│ 1    ┆ 2022-05-25 09:15:00.648681 ┆ 2    │
│ 1    ┆ 2022-05-25 09:30:00.648681 ┆ 2    │
│ 1    ┆ 2022-05-25 09:45:00.648681 ┆ 2    │
│ 1    ┆ 2022-05-25 10:00:00.648681 ┆ 3    │
│ 1    ┆ 2022-05-25 10:15:00.648681 ┆ 3    │
│ 1    ┆ 2022-05-25 10:30:00.648681 ┆ 3    │
│ 1    ┆ 2022-05-25 10:45:00.648681 ┆ 3    │
│ 2    ┆ 2022-05-25 08:00:00.648681 ┆ 3    │
│ 2    ┆ 2022-05-25 08:15:00.648681 ┆ 3    │
│ 2    ┆ 2022-05-25 08:30:00.648681 ┆ 3    │
│ 2    ┆ 2022-05-25 08:45:00.648681 ┆ 3    │
│ 2    ┆ 2022-05-25 09:00:00.648681 ┆ 4    │
│ 2    ┆ 2022-05-25 06:00:00.648681 ┆ 1    │
│ 2    ┆ 2022-05-25 06:15:00.648681 ┆ 1    │
│ 2    ┆ 2022-05-25 06:30:00.648681 ┆ 1    │
│ 2    ┆ 2022-05-25 06:45:00.648681 ┆ 1    │
│ 2    ┆ 2022-05-25 07:00:00.648681 ┆ 2    │
│ 2    ┆ 2022-05-25 07:15:00.648681 ┆ 2    │
└──────┴────────────────────────────┴──────┘

在极地你会怎么做?

python group-by python-polars
1个回答
1
投票

我不确定我是否正确理解了这个问题。

从您期望的结果来看,第 3 列似乎在每天和每组的第一个小时从 1 开始。然后每小时增加 1。

如果是这种情况,您可以通过计算小时、组和天的排名来重现它。

with pl.Config(tbl_rows=24):
    df.with_columns(
        pl.col('col2').dt.hour().rank(method='dense')
          .over(pl.col('col1'),pl.col('col2').dt.truncate('1d'))
          .alias('col3')
    )
shape: (23, 3)
┌──────┬────────────────────────────┬──────┐
│ col1 ┆ col2                       ┆ col3 │
│ ---  ┆ ---                        ┆ ---  │
│ i64  ┆ datetime[μs]               ┆ u32  │
╞══════╪════════════════════════════╪══════╡
│ 1    ┆ 2022-05-25 08:00:00.648681 ┆ 1    │
│ 1    ┆ 2022-05-25 08:15:00.648681 ┆ 1    │
│ 1    ┆ 2022-05-25 08:30:00.648681 ┆ 1    │
│ 1    ┆ 2022-05-25 08:45:00.648681 ┆ 1    │
│ 1    ┆ 2022-05-25 09:00:00.648681 ┆ 2    │
│ 1    ┆ 2022-05-25 09:15:00.648681 ┆ 2    │
│ 1    ┆ 2022-05-25 09:30:00.648681 ┆ 2    │
│ 1    ┆ 2022-05-25 09:45:00.648681 ┆ 2    │
│ 1    ┆ 2022-05-25 10:00:00.648681 ┆ 3    │
│ 1    ┆ 2022-05-25 10:15:00.648681 ┆ 3    │
│ 1    ┆ 2022-05-25 10:30:00.648681 ┆ 3    │
│ 1    ┆ 2022-05-25 10:45:00.648681 ┆ 3    │
│ 2    ┆ 2022-05-25 08:00:00.648681 ┆ 3    │
│ 2    ┆ 2022-05-25 08:15:00.648681 ┆ 3    │
│ 2    ┆ 2022-05-25 08:30:00.648681 ┆ 3    │
│ 2    ┆ 2022-05-25 08:45:00.648681 ┆ 3    │
│ 2    ┆ 2022-05-25 09:00:00.648681 ┆ 4    │
│ 2    ┆ 2022-05-25 06:00:00.648681 ┆ 1    │
│ 2    ┆ 2022-05-25 06:15:00.648681 ┆ 1    │
│ 2    ┆ 2022-05-25 06:30:00.648681 ┆ 1    │
│ 2    ┆ 2022-05-25 06:45:00.648681 ┆ 1    │
│ 2    ┆ 2022-05-25 07:00:00.648681 ┆ 2    │
│ 2    ┆ 2022-05-25 07:15:00.648681 ┆ 2    │
└──────┴────────────────────────────┴──────┘

代码详情:

pl.col('col2').dt.hour()
返回一天中的小时
pl.col('col2').dt.truncate('1d')
返回日期
.rank(method='dense').over()
计算特定周长内的排名。这是一个窗口函数。

这就是你想要实现的目标吗?

© www.soinside.com 2019 - 2024. All rights reserved.