Python np.busday_count在两个日期列之间,每行的结果为-1

Python np.busday_count在两个日期列之间,每行的结果为-1,python,numpy,Python,Numpy,我正在计算两个日期列之间的工作日。我已经使用pandas将这些列转换为datetime。当我使用numpy计算工作天数时,每行得到-1 import pandas as pd import numpy as np import datetime # Date check yesterday = date.today()-timedelta(1) open_date = yesterday.strftime("%m/%d/%Y") prior_yesterday = date.today()-

我正在计算两个日期列之间的工作日。我已经使用pandas将这些列转换为datetime。当我使用numpy计算工作天数时,每行得到-1

import pandas as pd
import numpy as np
import datetime

# Date check
yesterday = date.today()-timedelta(1)
open_date = yesterday.strftime("%m/%d/%Y")
prior_yesterday = date.today()- timedelta(2)
opendate=prior_yesterday.strftime("%m/%d/%Y")
currentdate = date.today().strftime("%m/%d/%Y")

open = pd.read_excel(r'C:\Desktop\Open.xlsx',
                     sheet_name = 'Open',
                     header = 0,
                     )
这是基于前一天计算的,因为提取数据时项目是打开的

for index , row in open.iterrows():
    open['Open_Date'] = open_date

open['CREATE_DATE'] = pd.to_datetime(open['CREATE'])
open['OPEN_DATE'] = pd.to_datetime(open['Open_Date'])

for index , row in open.iterrows():
    open['Open_Days'] =np.busday_count(row['CREATE_DATE'],row['OPEN_DATE'])
日期的旧格式是字符串格式,所以我将整个列更改为日期和时间格式

CREATE      Open_Date   CREATE_DATE          OPEN_DATE
09/05/2018  10/23/2018  2018-09-05 00:00:00 2018-10-23 00:00:00
10/02/2018  10/23/2018  2018-10-02 00:00:00 2018-10-23 00:00:00
10/17/2018  10/23/2018  2018-10-17 00:00:00 2018-10-23 00:00:00
10/17/2018  10/23/2018  2018-10-17 00:00:00 2018-10-23 00:00:00
这是我的日期格式

我如何避免这种情况

问候,,
Ren.

首先,理解为什么这不起作用。这不起作用的一个原因是,在左侧的for循环(赋值)中,行或索引在任何地方都不存在

循环中的每一步都会创建一个值,并将其反复填充到数据帧中:

# Iterate over each row of the DataFrame
for index , row in open.iterrows():
    # count business days for current row
    bday_count = np.busday_count(row['CREATE_DATE'],row['OPEN_DATE'])
    # create a new column in the DataFrame
    # broadcast `bday_count` to every value
    open['Open_Days'] = bday_count
因此,
Open_Days
列最后包含最后一行的
bday_计数。所有早期的值在每次迭代时都被覆盖

可以完全跳过填充
Open\u Date
的较早for循环,只需将
Open['Open\u Date']=Open\u Date
设置一次即可。这也可以表示它是一个循环,但主体既不使用
索引
,也不使用

如果要沿中的行应用函数,请使用


如果打开['REASSIGNDATE'].any()='':打开['open\u DAYS']=open.apply(lambda x:np.busday\u计数(x.CREATEDATE,x.open\u日期),axis=1)否则:打开['open\u DAYS']=open.apply(lambda x:np.busday\u计数(x.REASSIGNDATE,x.open\u日期),axis=1)
i获取值错误:('cannot convert convert float NaN to integer','发生在索引0')。REASSIGNDATE中有几行是空的。使用np.where i get在我将这两个变量赋给不同的变量并检查它们时不能使用关键字error。使用类似这样的np.where('REASSIGNDATE'='',S1,S2)来看看dropna和fillna函数。如果没有帮助,用一些示例数据创建一个新问题。我不得不阅读这些评论中的代码。我提出了一个新问题。
df["Open_Days"] = df.apply(lambda x: np.busday_count(x.CREATE_DATE, x.OPEN_DATE), axis=1)