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

