np.busday_count между двумя столбцами даты дает -1 в качестве результата для каждой строки - PullRequest
0 голосов
/ 24 октября 2018

Я рассчитываю рабочие дни между двумя столбцами даты.Я преобразовал эти столбцы в дату и время, используя панд.когда я использую 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 голосов
/ 25 октября 2018

Во-первых, поймите, почему это не работает.Причиной того, почему это не работает, является то, что в цикле 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 из последней строки.Все более ранние значения перезаписывались на каждой итерации.

Более ранний цикл for, который заполняет Open_Date, может быть полностью пропущен, просто установите 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...