使用np.busday_count计算工作日间隔时如何处理NaT值问题
问题解决逻辑
你之前使用f['Start time'] is pd.NaT的写法存在问题:is是用于判断单个对象身份的运算符,无法直接对整个Series做批量矢量判断,判断Series内的NaT值要使用.isna()方法。
实现方案
首先先将两列统一转为datetime格式,减少重复代码:
f['Start time'] = pd.to_datetime(f['Start time']) f['Stop time'] = pd.to_datetime(f['Stop time'])
方案1:保留NaT对应的空值
np.busday_count本身支持datetime64类型的NaT输入,对应行计算结果会自动返回NaT,无需额外判断:
f['days'] = np.busday_count( f['Start time'].values.astype('datetime64[D]'), f['Stop time'].values.astype('datetime64[D]') )
方案2:给含NaT的行指定默认值
如果需要给起止时间存在NaT的行设置自定义默认值(比如0、-1等),可以结合np.where做条件判断:
# 示例:只要起止时间有一个为NaT,days赋值为0,否则计算工作日天数 f['days'] = np.where( f['Start time'].isna() | f['Stop time'].isna(), 0, # 可替换为你需要的默认值 np.busday_count( f['Start time'].values.astype('datetime64[D]'), f['Stop time'].values.astype('datetime64[D]') ) )
补充说明
如果需要单独判断某一行单个值是不是NaT,可以用f.loc[行索引, 'Start time'] is pd.NaT的写法;批量判断多个条件时,或逻辑用位运算符|,且逻辑用位运算符&,注意每个判断条件要单独加括号。
内容的提问来源于stack exchange,提问作者d8888d
相关产品推荐
相关产品推荐

