我正在尝试对极坐标中的数据帧进行下采样,该数据帧有一列带有时间戳。我想将列下采样到 1 秒的间隔。但是,当我使用 groupby_dynamic 执行此操作时,只有具有值的秒才会出现在结果中。但我希望结果包含没有条目的偶数秒,以便我可以转发填充。
我尝试了group_by_dynamic,但它似乎没有达到我想要的效果。
taq_df.groupby_dynamic("timestamp", every = '1s').agg(pl.exclude("bestex_timestamp").last())
pl.DataFrame.upsample
将填补缺失的时间戳。
考虑以下示例框架。
import polars as pl
from datetime import datetime
df = pl.DataFrame({
"timestamp": [
datetime(2024, 1, 1, 0, 0, 0, 0),
datetime(2024, 1, 1, 0, 0, 2, 5),
datetime(2024, 1, 1, 0, 0, 3, 0),
datetime(2024, 1, 1, 0, 0, 5, 1),
],
"value": [1, 2, 3, 4],
}).set_sorted("timestamp")
shape: (4, 2)
┌────────────────────────────┬───────┐
│ timestamp ┆ value │
│ --- ┆ --- │
│ datetime[μs] ┆ i64 │
╞════════════════════════════╪═══════╡
│ 2024-01-01 00:00:00 ┆ 1 │
│ 2024-01-01 00:00:02.000005 ┆ 2 │
│ 2024-01-01 00:00:03 ┆ 3 │
│ 2024-01-01 00:00:05.000001 ┆ 4 │
└────────────────────────────┴───────┘
按照问题中的建议简单应用
pl.DataFrame.group_by_dynamic
,会产生以下数据帧(缺少第 1 秒和第 4 秒的时间戳)。
(
df
.group_by_dynamic(index_column="timestamp", every="1s")
.agg(pl.col("value").last())
)
shape: (4, 2)
┌─────────────────────┬───────┐
│ timestamp ┆ value │
│ --- ┆ --- │
│ datetime[μs] ┆ i64 │
╞═════════════════════╪═══════╡
│ 2024-01-01 00:00:00 ┆ 1 │
│ 2024-01-01 00:00:02 ┆ 2 │
│ 2024-01-01 00:00:03 ┆ 3 │
│ 2024-01-01 00:00:05 ┆ 4 │
└─────────────────────┴───────┘
现在,应用
pl.DataFrame.upsample
填充缺失的时间戳。新行的所有其他列都将为空值。
(
df
.group_by_dynamic(index_column="timestamp", every="1s")
.agg(pl.col("value").last())
.upsample("timestamp", every="1s")
)
shape: (6, 2)
┌─────────────────────┬───────┐
│ timestamp ┆ value │
│ --- ┆ --- │
│ datetime[μs] ┆ i64 │
╞═════════════════════╪═══════╡
│ 2024-01-01 00:00:00 ┆ 1 │
│ 2024-01-01 00:00:01 ┆ null │
│ 2024-01-01 00:00:02 ┆ 2 │
│ 2024-01-01 00:00:03 ┆ 3 │
│ 2024-01-01 00:00:04 ┆ null │
│ 2024-01-01 00:00:05 ┆ 4 │
└─────────────────────┴───────┘