Как посчитать рабочие дни в месяце на целый год с разной маской каждую неделю? - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь создать программу, которая будет одинаково распределять выходной день сотрудников.Есть 4 группы, и у каждой группы есть свой weekmask для каждой недели месяца.До сих пор я сделал код, который изменит weekmask, когда он найдет 0 в Dataframe (воскресенье).Я застрял на структурировании этой команды np.busday_count(start, end, weekmask=) для автоматического изменения даты начала и окончания.

My Dataframe выглядит так: Dataframe

А вот и мой код:

 a: int = 0
 week_mask: str = '1100111' 

 def _change_week_mask():
    global a, week_mask
    a += 1
    if a == 1:
        week_mask = '1111000'
    elif a == 2:
        week_mask = '1111111'
    elif a == 3:
        week_mask = '0011111'
    else:
        a = 0

for line in rows['Workday']:
    if line is '0':
        _change_week_mask()

1 Ответ

0 голосов
/ 28 ноября 2018

Изменить: изменил значение начальной недели с 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

Сообщите мне, если это потребует некоторых изменений согласно вашему требованию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...