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

使用np.busday_count计算工作日间隔遇NaT报错如何解决

问题核心原因

np.busday_count 本身不支持NaT类型输入,当输入包含NaT时,函数会尝试将其转为整数类型,而NaT对应的底层是浮点型NaN,因此抛出ValueError: cannot convert float NaN to integer错误。

最优解决方案

优先使用向量化过滤计算方案,性能远高于逐行遍历的apply方案,实现逻辑为:先过滤出两列均为有效日期的行计算工作日间隔,其余行直接填充NaN。

代码示例

基础环境与测试数据

import pandas as pd
import numpy as np

# 测试数据示例
df = pd.DataFrame({
    'start_date': pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04']),
    'end_date': pd.to_datetime(['2024-01-05', pd.NaT, '2024-01-10', pd.NaT])
})

核心计算逻辑

# 1. 生成有效行掩码:起止日期均不为NaT的行,若仅end_date可能为空可简化为 df['end_date'].notna()
valid_mask = df[['start_date', 'end_date']].notna().all(axis=1)

# 2. 初始化diff列为NaN
df['diff'] = np.nan

# 3. 仅对有效行计算工作日间隔
df.loc[valid_mask, 'diff'] = np.busday_count(
    df.loc[valid_mask, 'start_date'].astype('datetime64[D]').values,
    df.loc[valid_mask, 'end_date'].astype('datetime64[D]').values
)
小数据量可选简化方案

如果你的数据量在10万行以下,也可以用更简洁的apply写法,可读性更高:

df['diff'] = df.apply(
    lambda row: np.busday_count(row['start_date'].date(), row['end_date'].date()) 
    if pd.notna(row['start_date']) and pd.notna(row['end_date']) 
    else np.nan,
    axis=1
)
注意事项
  • 计算前需确保start_date和end_date均已通过pd.to_datetime()转为datetime类型,避免字符串类型报错
  • 转为datetime64[D]是为了对齐日期精度,避免因时间戳带时分秒导致的计算错误

内容的提问来源于stack exchange,提问作者Lucas Ferreira de Oliveira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:57:00