如何将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
相关产品推荐
相关产品推荐

