Изменить: изменил значение начальной недели с 6 на 0.
Хорошо, поэтому, чтобы ответить на вашу проблему, я создал образец фрейма данных с кодом ниже.
Затем я добавилниже столбцов к фрейму данных.
- dayofweek - чтобы перейти к аналогичным данным, которые вы создали, установив каждое воскресенье как ноль.В этом случае понедельник устанавливается на ноль, а воскресенье - на шесть.
- weeknum - неделя года
- week - вместо подсчета и изменения маски недели, я присвоил значение недели сОт 0 до 3, и на основании этого мы можем вычислить маску.
- weekmask - используя значение недели, я вычислю маску, вам может потребоваться выровнять ее в соответствии с вашей логикой.
- уик-энд - дата окончания, которую я рассчитал, добавив 7 к дате начала, если месяц меняется в середине недели, то у него будет дата окончания месяца.
b
после этого мы можем создатьновый фрейм данных для ввода только в конце недели, в данном случае понедельник равен 0, поэтому я взял 0.
, затем вы можете применить функцию и сохранить результат во фрейме данных.import datetime
import pandas as pd
import numpy as np
df_ = pd.DataFrame({'startdate':pd.date_range(pd.to_datetime('2018-10-01'), pd.to_datetime('2018-11-30'))})
df_['dayofweek'] = df_.startdate.dt.dayofweek
df_['remaining_days_in_month'] = df_.startdate.dt.days_in_month - df_.startdate.dt.day
df_['week'] = df_.startdate.dt.week%4
df_['day'] = df_.startdate.dt.day
df_['weekmask'] = df_.week.map({0 : '1100111', 1 : '1111000' , 2 : '1111111', 3: '0011111'})
df_['weekenddate'] = [x[0] + datetime.timedelta(days=(7-x[1])) if x[2] > 7-x[1] else x[0] + datetime.timedelta(days=(x[2])) for x in df_[['startdate','dayofweek','remaining_days_in_month']].values]
final_df = df_[(df_['dayofweek']==0) | ( df_['day']==1)][['startdate','weekenddate','weekmask']]
final_df['numberofdays'] = [ np.busday_count((x[0]).astype('<M8[D]'), x[1].astype('<M8[D]'), weekmask=x[2]) for x in final_df.values.astype(str)]
Вывод:
startdate weekenddate weekmask numberofdays
0 2018-10-01 2018-10-08 1100111 5
7 2018-10-08 2018-10-15 1111000 4
14 2018-10-15 2018-10-22 1111111 7
21 2018-10-22 2018-10-29 0011111 5
28 2018-10-29 2018-10-31 1100111 2
31 2018-11-01 2018-11-05 1100111 3
35 2018-11-05 2018-11-12 1111000 4
42 2018-11-12 2018-11-19 1111111 7
49 2018-11-19 2018-11-26 0011111 5
56 2018-11-26 2018-11-30 1100111 2
Сообщите мне, если это потребует некоторых изменений согласно вашему требованию.