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

如何基于时间戳列按时间间隔偏移Polars数据框中的列?

Polars按时间偏移实现类似shift的功能

Polars目前没有直接支持按时间维度偏移的shift方法,但可以通过以下两种简洁的方式实现你需要的按时间(如3天前)计算差值的需求:

方法一:左连接+日期偏移

通过将原数据与自身按偏移后的日期进行左连接,匹配到对应时间点的历史值,再计算差值:

import polars as pl

# 示例数据
df = pl.DataFrame({
    "myDateColumn": pl.date_range(start="2024-01-01", end="2024-01-10", interval="1d"),
    "myValue": [10, 12, 15, 14, 18, 20, 22, 25, 23, 27]
})

# 计算3天前的值并求差值
result = df.join(
    # 生成偏移3天的日期作为连接键,同时保留对应值
    df.select(
        pl.col("myDateColumn").dt.offset_by("3d").alias("join_date"),
        pl.col("myValue").alias("value_3d_ago")
    ),
    left_on="myDateColumn",
    right_on="join_date",
    how="left"
).with_columns(
    difference_from_3d_ago = pl.col("myValue") - pl.col("value_3d_ago")
).drop("join_date")

print(result)

这种方法的优势是不依赖日期连续性,即使数据中有缺失的日期,也能精准匹配到存在的3天前记录。

方法二:group_by_dynamic动态分组

如果你的时间序列是连续的,使用group_by_dynamic按时间窗口偏移来提取历史值,效率更高:

import polars as pl

df = pl.DataFrame({
    "myDateColumn": pl.date_range(start="2024-01-01", end="2024-01-10", interval="1d"),
    "myValue": [10, 12, 15, 14, 18, 20, 22, 25, 23, 27]
})

result = df.sort("myDateColumn").with_columns(
    # 按天分组,偏移-3天取对应窗口的第一个值(即3天前的值)
    value_3d_ago = pl.col("myValue").group_by_dynamic(
        "myDateColumn",
        every="1d",
        offset="-3d",
        period="1d"
    ).agg(pl.first("myValue")).flatten()
).with_columns(
    difference_from_3d_ago = pl.col("myValue") - pl.col("value_3d_ago")
)

print(result)

这种方法适合时间连续且规则的序列,内部会按时间窗口高效处理,避免了显式连接的开销。

内容的提问来源于stack exchange,提问作者MYK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:00:05