如何基于时间戳列按时间间隔偏移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
相关产品推荐
相关产品推荐

