如何在 Polars 中对 time 列执行小时加减运算(支持跨日循环)

夜婷姑娘_7175

夜婷姑娘_7175

2026-10-20

892人浏览

原创

如何在 Polars 中对 time 列执行小时加减运算(支持跨日循环)

Polars 当前不支持直接对 pl.time 类型列进行 pl.duration 算术运算;本文介绍一种健壮、可读性强的解决方案:将 time 与任意基准日期组合为 datetime,执行加减后提取 time 部分,自动处理 00:00 ± 小时的跨日逻辑(如 01:00 − 2h → 23:00)。

polars 当前不支持直接对 `pl.time` 类型列进行 `pl.duration` 算术运算;本文介绍一种健壮、可读性强的解决方案:将 time 与任意基准日期组合为 datetime,执行加减后提取 time 部分,自动处理 00:00 ± 小时的跨日逻辑(如 01:00 − 2h → 23:00)。

在 Polars 中操作时间(time)类型列时,一个常见需求是对起止时间进行偏移调整——例如为排班表预留缓冲时间:将 start_time 提前 n 小时,end_time 推后 n 小时。然而,Polars 的 time 类型目前不支持直接与 duration 进行加减运算(该功能仅适用于 date 和 datetime),因此需借助「日期-时间组合」技巧实现安全、闭环的时钟运算。

✅ 推荐方案:用固定日期 + dt.combine() 实现循环时间运算

核心思路是:

  1. 选择一个任意但确定的基准日期(如 2025-01-01);
  2. 使用 .dt.combine() 将 time 列与该日期拼接为 datetime;
  3. 对 datetime 执行 + duration 或 − duration(天然支持跨日进退);
  4. 最终用 .dt.time() 提取结果中的时间部分——自动完成 23:00 + 2h → 01:00、01:00 − 3h → 22:00 等模 24 小时计算。

以下是封装好的可复用函数:

import polars as pl

def add_duration_to_time(time_col: pl.Expr, duration_col: pl.Expr) -> pl.Expr:
    """
    对 time 表达式安全添加 duration(支持跨日循环)

    示例:
      05:00 + 1h → 06:00  
      23:00 + 2h → 01:00  
      01:00 - 2h → 23:00
    """
    base_date = pl.date(2025, 1, 1)  # 任意固定日期,无需真实存在
    return (base_date.dt.combine(time_col) + duration_col).dt.time()

# 构建示例数据(含已转为 time 类型的列)
df = pl.DataFrame({
    "start_time": ["09:00", "09:00", "09:00", "09:00", "09:00", "00:00", "00:00"],
    "end_time": ["18:00", "18:00", "18:00", "18:00", "18:00", "00:00", "00:00"],
}).with_columns(
    start_time=pl.col("start_time").str.to_time("%H:%M"),
    end_time=pl.col("end_time").str.to_time("%H:%M"),
)

# 定义偏移量:提前/推后 1 小时
n_hours = 1
duration = pl.duration(hours=n_hours)

# 应用偏移:start_time 减、end_time 加
result = df.with_columns(
    start_time_adjusted=add_duration_to_time(pl.col("start_time"), -duration),
    end_time_adjusted=add_duration_to_time(pl.col("end_time"), duration),
)

print(result)

输出结果(关键列节选):

┌────────────┬──────────┬───────────────────┬───────────────────┐
│ start_time ┆ end_time ┆ start_time_adjusted ┆ end_time_adjusted │
│ ---        ┆ ---      ┆ ---               ┆ ---               │
│ time       ┆ time     ┆ time              ┆ time              │
╞════════════╪══════════╪═══════════════════╪═══════════════════╡
│ 09:00:00   ┆ 18:00:00 ┆ 08:00:00          ┆ 19:00:00          │
│ 00:00:00   ┆ 00:00:00 ┆ 23:00:00          ┆ 01:00:00          │
└────────────┴──────────┴───────────────────┴───────────────────┘

⚠️ 注意事项与最佳实践

  • 基准日期必须为 date(非 datetime):pl.date(2025,1,1) 返回的是 naive date,与 time 组合后生成 naive datetime,避免时区干扰;若使用 pl.datetime(),可能因时区或精度引发意外行为。
  • duration 单位灵活:除 hours= 外,也支持 minutes=, seconds=, milliseconds= 等,甚至可组合使用(如 pl.duration(hours=1, minutes=30))。
  • 空值(null)安全:该方法天然继承 Polars 的 null 传播机制——若 start_time 为 null,则 start_time_adjusted 也为 null,无需额外处理。
  • 性能考量:虽然引入了日期组合步骤,但底层基于 Arrow 高效实现,对百万级行数据仍保持优异性能;远优于 Python 循环或 apply。

? 扩展提示:若需动态偏移(如每行不同小时数),只需将 duration 替换为对应数值列(如 pl.col("buffer_hours").cast(pl.Int64).mul(3600_000_000) 转为微秒 duration),同样适用。

此方法兼顾正确性、可维护性与 Polars 原生风格,是当前生态下操作 time 类型最推荐的工程实践。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1771

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4624

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1749

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

27337

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3307

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3307

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1203

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2563

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.9万人学习