如何计算全年不同月份的每周工作日的每周工作日?

时间:2018-11-27 10:05:57

标签: python python-3.x pandas numpy

我正在尝试制定一个程序,以平均分配员工的休息日。有4个小组,每个小组每个月的每个星期都有自己的weekmask。到目前为止,我已经编写了一个代码,它将在weekmask(星期日)中找到0时更改Dataframe。我坚持构造该命令np.busday_count(start, end, weekmask=)来自动更改开始和结束日期。

我的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 :(得分:1)

编辑:将开始一周的值从6更改为0。

好吧,为回答您的问题,我用下面的代码创建了示例数据框。

然后我在数据框中添加了以下几列。

  • dayofweek-访问您通过将每个星期日设置为零而创建的类似数据。在这种情况下,星期一设置为零,星期日设置为六个。
  • weeknum-一年中的一周
  • week-我没有计算周值掩码,也没有更改周掩码,而是将周的值从0分配到了3,然后可以基于它计算出掩码。
  • weekmask-使用星期的值,我已经计算出了掩码,您可能需要根据逻辑将其对齐。
  • weekenddate-结束日期,我通过在开始日期加上7来计算得出的结束日期,如果月份在周中更改,那么它将具有月份结束日期。

b

在此之后,我们可以创建一个新的数据框,使其仅具有周末输入,在这种情况下,星期一是0,所以我取了0。

然后您可以应用函数并将结果存储到数据框中。 导入日期时间

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

请告知我是否需要根据您的要求进行一些更改。