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

