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

时间:2018-10-24 17:57:51

标签: python numpy

我正在计算两个日期列之间的工作日。我已经使用熊猫将这些列转换为日期时间。当我使用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

这是我的日期格式。

如何避免这种情况。

关于, 仁。

1 个答案:

答案 0 :(得分:1)

首先,了解为什么这不起作用。不能执行此操作的一个指示是,在左侧(赋值)的for循环中,行或索引在任何地方都不存在。

循环中的每个步骤都会创建一个值并将其反复填充到DataFrame中:

# 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_count。每次迭代都覆盖了所有先前的值。

可以完全跳过填充Open_Date的早期for循环,只需设置一次open['Open_Date'] = open_date。这也可能表明它是一个循环,但是主体既不使用index,也不使用row

如果要在熊猫行中应用函数,请使用.apply

df["Open_Days"] = df.apply(lambda x: np.busday_count(x.CREATE_DATE, x.OPEN_DATE), axis=1)