【问题标题】:np.where, np.busday_count() with pandas columnsnp.where, np.busday_count() 和 pandas 列
【发布时间】:2020-12-29 09:50:23
【问题描述】:

我在将以下逻辑链联系在一起时遇到了一些麻烦:

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

从网上阅读,似乎问题是由于一个日期列中的空值引起的,无论我保留为字符串并且空值是无,或者当我转换为空值变为NaT 的日期时间时,与 np.where() 函数结合使用的 pandas 语法糖。

有没有更简单的方法来做到这一点?理想情况下,由于循环整个数据帧所需的时间,我会尽量避免 for 循环。

我能够通过蛮力实现这一点,但我想知道如何在不循环整个数据帧的情况下实现这一点。

【问题讨论】:

  • 请发布您的数据框示例
  • 确定,我加到帖子里了
  • 总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是屏幕截图)放在有问题的(不是评论)中。还有其他有用的信息。
  • 添加了错误信息
  • 从您发布的数据看来,它不是 NaN(Null) 而是“无”文本。请检查

标签: python pandas numpy datetime nan


【解决方案1】:

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

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

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

然后将该列从0 更改回Nat

这不是一个干净的解决方案,但它是一些东西。

希望它有效。

这样做的问题是在where() 函数中不适用于多个条件“&”,但似乎不是你的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2016-08-04
    • 2017-02-02
    • 1970-01-01
    • 2020-04-29
    • 2019-01-29
    相关资源
    最近更新 更多