如何在Polars的time类型列中加减小时数?
Polars中对time类型字段加减时长的处理方法
Polars目前没有直接针对pl.time类型进行小时/分钟加减的内置API,你提到的「转为固定日期的datetime类型处理后再转回time」是目前最稳妥且推荐的方案,能自动处理跨天溢出的情况(比如01:00减2小时得到23:00)。
具体实现示例
假设你的DataFrame名为df,要给start_time减2小时,end_time加3小时:
import polars as pl # 定义固定基准日期(任意日期都可以,不影响最终time结果) base_date = pl.date(2024, 1, 1) df = df.with_columns( # 将time转为datetime,加减时长后转回time start_time_adjusted=(base_date + pl.col("start_time") - pl.duration(hours=2)).dt.time(), end_time_adjusted=(base_date + pl.col("end_time") + pl.duration(hours=3)).dt.time() )
另一种备选方案:基于秒数计算
如果你不想转datetime,也可以将time转为总秒数,通过数值运算后再转回time,但需要手动处理跨天的模运算:
df = df.with_columns( start_time_adjusted=pl.from_epoch( (pl.col("start_time").dt.total_seconds() - 2*3600) % 86400, time_unit="s" ).dt.time(), end_time_adjusted=pl.from_epoch( (pl.col("end_time").dt.total_seconds() + 3*3600) % 86400, time_unit="s" ).dt.time() )
这种方法通过对86400(一天的总秒数)取模,确保秒数始终在0-86399范围内,从而得到正确的time值。
总结
两种方法都能实现需求,但转datetime的方式更直观,Polars会自动处理日期滚动,不需要手动处理模运算,代码可读性更高。
内容的提问来源于stack exchange,提问作者David Waterworth
相关产品推荐
相关产品推荐

