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

如何将DataFrame中两个时间戳差值向上取整为小时并新增列

解决Pandas中时间差向上取整到小时的问题

你遇到的错误很典型:math.ceil()是用来处理单个数值的函数,没办法直接作用于Pandas的Series(整列数据),这就是为什么会抛出TypeError: cannot convert the series to <class 'float'>的原因。我们需要用矢量化的方法来处理整列数据,下面给你几个高效的解决方案:

方法1:使用NumPy的矢量化向上取整(推荐,效率最高)

NumPy的np.ceil()可以直接处理Pandas Series,完美适配批量数据的取整需求:

import pandas as pd
import numpy as np

# 先确保时间列是datetime类型(如果还没转换的话)
df['timeStamp'] = pd.to_datetime(df['timeStamp'])
df['forecastRan'] = pd.to_datetime(df['forecastRan'])

# 计算时间差总小时数并向上取整
df['time_diff_ceil_hours'] = np.ceil((df['timeStamp'] - df['forecastRan']).dt.total_seconds() / 3600)

方法2:直接对Timedelta对象向上取整到小时

Pandas的Timedelta类型支持直接用dt.ceil()方法按时间单位取整,这种方式更直观,不需要手动计算秒数:

# 先计算时间差,再向上取整到最近的下一小时,最后提取小时数
df['time_diff_ceil_hours'] = (df['timeStamp'] - df['forecastRan']).dt.ceil('H').dt.total_seconds() / 3600

方法3:使用Pandas的apply方法(灵活但效率较低)

如果你更习惯用math.ceil(),可以通过apply()把函数逐个应用到Series的每个元素上,但这种方法在大数据集上的效率不如前两种:

import math

df['time_diff_ceil_hours'] = (df['timeStamp'] - df['forecastRan']).dt.total_seconds().div(3600).apply(math.ceil)

验证结果

以你给出的第一行数据为例:2016-11-23 23:00:00和2016-11-23 12:18:00的时间差是10小时42分钟,也就是10.7小时,以上三种方法都会返回11.0,符合你向上取整到下一小时的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:38:08