我正在计算两个日期列之间的工作日。我已经使用熊猫将这些列转换为日期时间。当我使用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
这是我的日期格式。
如何避免这种情况。
关于, 仁。
答案 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)