np.where,带有熊猫列的np.busday_count()

时间:2020-09-10 20:45:29

标签: python pandas numpy datetime nan

在将以下逻辑链捆绑在一起时,我遇到了一些麻烦:

np.where(df['date3'].isnull(), np.busday_count(df['date2'], df['date1'], holidays=my_holidays), 
np.busday_count(df['date3'], df['date1'], holidays=my_holidays))

这是一个示例:

date1       date2       date3
2019-01-31  2019-02-01  None
2019-01-31  2019-02-01  None
2019-02-28  2018-10-03  2019-02-28
2019-02-28  2018-10-03  2019-02-28
2019-02-28  2018-10-03  2019-02-28

简要背景-date3列具有一些空值。我试过转换为日期时间,然后在每个日期列之后使用.dt.date运行此功能。我已经在上面的方式中尝试过日期为“ 2019-01-31”类型的日期。两者都给我ValueError: Cannot compute a business day count with a NaT (not-a-time) date when trying from the string versions of the datesValueError: cannot convert float NaN to integer when trying after converting to datetime

从在线阅读开始,看来问题是由于one date列中的空值所引起的,无论我是作为字符串保留且null为None,还是当我转换为null变为{{1}的datetime时},与NaT函数结合使用的大熊猫语法糖。

是否有更简单的方法来完成此操作?理想情况下,由于要遍历整个数据帧需要时间,因此我会尽量避免for循环。

我能够通过蛮力完成此任务,但我想知道如何在不遍历整个数据帧的情况下实现此目标。

1 个答案:

答案 0 :(得分:-1)

当我想使用busday_count()函数时,即使我使用when()函数,我也面临着同样的问题,但是它似乎仍然适用于整列,并且由于Nat值而失败。 对我而言,有效的方法是在where()函数之前将Nat值替换为0。

df['date3']= df['date3'].fillna(0)

然后在where()之类的条件下使用== 0 or >= 0函数,它对我有用。

,然后将该列从0改回到Nat

这不是一个干净的解决方案,但它是什么。

希望如此。

此问题是where()函数中的多个条件“&”不起作用,但看来情况并非如此。