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

Pandas计算两日期列间工作小时数报Series真值歧义错误

问题根因
  • businessDuration 函数原生仅支持传入单个日期时间对象,不支持直接传入Pandas整列(Series类型)作为参数。函数内部存在对输入值的布尔判断逻辑,直接传入Series时Pandas无法判定整列的真假,就会抛出你看到的ValueError: The truth value of a Series is ambiguous报错。
  • 你提供的代码存在笔误:holidaylist = pyholidays.US()重复编写了两次,直接运行会触发语法错误。
  • 额外注意:传入日期列前必须先将字符串格式的时间转为Pandas datetime类型,否则会出现时间解析异常。
解决方案

方案1:逐行计算(适合中小数据量,新手友好)

使用df.apply指定按行遍历,逐行取出两个时间字段传入函数计算即可,修正后的可运行代码如下:

from business_duration import businessDuration
import pandas as pd
from datetime import time
import holidays as pyholidays

# 第一步:将两列时间从字符串转为datetime格式
df['ReqRecv'] = pd.to_datetime(df['ReqRecv'])
df['CompRecv'] = pd.to_datetime(df['CompRecv'])

# 固定公共参数
starttime = time(9, 0, 0)
endtime = time(17, 0, 0)
holidaylist = pyholidays.US()
unit = 'hour'

# 按行遍历计算工作间隔时长,结果存入新列
df['work_duration_hour'] = df.apply(
    lambda row: businessDuration(
        startdate=row['ReqRecv'],
        enddate=row['CompRecv'],
        starttime=starttime,
        endtime=endtime,
        holidaylist=holidaylist,
        unit=unit
    ),
    axis=1
)

# 打印结果验证
print(df)

提示:你提供的测试样本中所有行的CompRecv时间都早于ReqRecv,计算结果会为负数。如果是业务上的时间填反,可以在传入参数前先判断两个时间的先后,交换顺序后再传入,避免出现无意义的负值。

方案2:向量化计算(适合十万行以上大数据量场景)

如果数据量较大,apply逐行计算速度较慢,可以替换为原生支持Pandas向量化操作的工作时长计算库,直接传入整列即可完成计算,运行速度会有数十倍提升。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:15:11