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

如何用Polars为Pandas DataFrame中每个ID计算行时间差

解决方案:用Polars窗口函数高效计算分组内会话间隔

直接用Polars的**窗口函数(over)**就能实现按ID分组计算会话间隔,这是Polars里最高效的方式,比map_groups性能好很多:

完整代码示例

import polars as pl
import pandas as pd

# 创建样本数据
data = {
    'ID': ['A', 'A', 'A', 'B', 'B', 'B'],
    'Timestamp': ['2023-01-01 10:00:00', '2023-01-01 10:30:00' ,'2023-01-01 11:00:00', '2023-01-01 12:00:00', '2023-01-01 12:30:00', '2023-01-01 13:00:00']
}

df = pd.DataFrame(data)
sessions_features = pl.from_pandas(df)

# 转换Timestamp为datetime类型
sessions_features = sessions_features.with_columns(
   pl.col("Timestamp").str.to_datetime()
)

# 新增会话间隔列
sessions_features = sessions_features.with_columns(
    pl.col("Timestamp")
    .diff()  # 计算当前行与上一行的时间差
    .dt.total_seconds()  # 转换为秒数
    .over("ID")  # 按ID分组计算
    .fill_null(0)  # 每个ID的第一行填充为0
    .cast(pl.Int64)  # 转为整数类型,匹配预期结果的i64
    .alias("time_between_sessions")
)

print(sessions_features)

关键逻辑说明

  • over("ID"):指定按ID分组执行后续的diff计算,相当于给每个ID单独计算时间差
  • diff():计算当前行Timestamp与同组上一行的差值,每个ID的第一行会得到null
  • fill_null(0):把每个ID的第一行间隔值填充为0,符合预期结果
  • 这种方式不需要拆分数据或用map_groups,Polars会自动优化执行效率,处理大数据量也很顺畅

输出结果

┌─────┬─────────────────────┬───────────────────────┐
│ ID  ┆ Timestamp           ┆ time_between_sessions │
│ --- ┆ ---                 ┆ ---                   │
│ str ┆ datetime[μs]        ┆ i64                   │
╞═════╪═════════════════════╪═══════════════════════╡
│ A   ┆ 2023-01-01 10:00:00 ┆ 0                     │
│ A   ┆ 2023-01-01 10:30:00 ┆ 1800                  │
│ A   ┆ 2023-01-01 11:00:00 ┆ 1800                  │
│ B   ┆ 2023-01-01 12:00:00 ┆ 0                     │
│ B   ┆ 2023-01-01 12:30:00 ┆ 1800                  │
│ B   ┆ 2023-01-01 13:00:00 ┆ 1800                  │
└─────┴─────────────────────┴───────────────────────┘

内容的提问来源于stack exchange,提问作者Camilo Piñón

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:35:00