У меня есть Dataframe
в Pandas
с буквой и двумя датами в виде столбцов. Я хотел бы рассчитать рабочие дни между двумя столбцами даты для предыдущей строки, используя shift()
, при условии, что значение Letter
будет одинаковым (с использованием .groupby()
). Я делал это с .apply()
. Это сработало, пока я не передал некоторые данные, в которых отсутствовала одна из дат. Я переместил все в функцию, чтобы обрабатывать недостающее значение с помощью предложения try/except
, но теперь моя функция возвращает NaN
для всего. Похоже, что значение None
для даты влияет на каждый вызов функции, тогда как я думаю, что это будет делать только тогда, когда Letter
от .groupby()
- A
.Работа с значениями None при использовании Pandas Groupby и приложением с функцией
import pandas as pd
from datetime import datetime
import numpy as np
def business_days(x):
try:
return pd.DataFrame(np.busday_count(x['First Date'].tolist(), x['Last Date'].tolist())).shift().reset_index(drop=True)
except ValueError:
return None
df = pd.DataFrame(data=[['A', datetime(2016, 1, 7), None],
['A', datetime(2016, 3, 1), datetime(2016, 3, 8)],
['B', datetime(2016, 5, 1), datetime(2016, 5, 10)],
['B', datetime(2016, 6, 5), datetime(2016, 6, 7)]],
columns=['Letter', 'First Date', 'Last Date'])
df['First Date'] = df['First Date'].apply(lambda x: x.to_datetime().date())
df['Last Date'] = df['Last Date'].apply(lambda x: x.to_datetime().date())
df['Gap'] = df.groupby('Letter').apply(business_days)
print df
Фактический выход:
Letter First Date Last Date Gap
0 A 2016-01-07 NaT NaN
1 A 2016-03-01 2016-03-08 NaN
2 B 2016-05-01 2016-05-10 NaN
3 B 2016-06-05 2016-06-07 NaN
Желаемая Выход:
Letter First Day Last Day Gap
0 A 2016-01-07 NAT NAN
1 A 2016-03-01 2016-03-08 NAN
2 B 2016-05-01 2016-05-10 NAN
3 B 2016-06-05 2016-06-07 7
В текущем коде, если письмо группа имеет единственный 'NaT' в одной строке, то функция busday_count поднимает ValueError и возвращается None , Вы хотите, чтобы вся группа Letter имела значения Gap NaN или вы хотите вычислить рабочие дни для строк, отличных от NaT? – unutbu
@unutbu Только для строк, отличных от NaT – user2242044