Довольно простой вопрос.Получить рабочие дни между последовательными рядами pandas
Я знаю:
df.diff()
дает мне дни между ними, и я знаю, что я мог бы сделать какой-то харизмы с
df.loc[df.Date.weekday == 4, 'Diff'] = 1
Но это не является оптимальным. Я попробовал
np.busday_count()
Но я получаю сообщение об ошибке Я не совсем понимаю. Вот пример кода с этой ошибкой:
In [36]: df = pd.DataFrame.from_dict({1: {'Date': '2016-01-01'}, 2: {'Date': '2016-01-02'}, 3: {'Date': '2016-01-03'}}, orient='index')
In [37]: df['Date'] = df.Date.astype('<M8[D]')
In [38]: np.busday_count(df.Date, df.Date.shift(1))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-38-07a4ae9a16f6> in <module>()
----> 1 np.busday_count(df.Date, df.Date.shift(1))
TypeError: Iterator operand 0 dtype could not be cast from dtype('<M8[ns]') to dtype('<M8[D]') according to the rule 'safe'
In [39]: df = pd.DataFrame.from_dict({1: {'Date': '2016-01-01'}, 2: {'Date': '2016-01-02'}, 3: {'Date': '2016-01-03'}}, orient='index')
In [40]: np.busday_count(df.Date, df.Date.shift(1))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-40-07a4ae9a16f6> in <module>()
----> 1 np.busday_count(df.Date, df.Date.shift(1))
TypeError: Iterator operand or requested dtype holds references, but the REFS_OK flag was not enabled
Чистое решение с явным приведением типов в NumPy DTYPE 'datetime64 [D]' работает без преобразования в список : 'np.busday_count (df.Date.values.astype ('datetime64 [D]'), df.Date.shift (1) .fillna (df.Date) .values.astype ('datetime64 [D]')) '. Поэтому это должно быть быстрее, но это не так читаемо. Вероятно, я бы написал функцию «my_busday_count» со всеми этими преобразованиями, которая последовательно работает на pd.Series/np.vectors и выводит правильно NaT, где это необходимо. – hynekcer