python根据入职时间计算每天在职人数

目的:根据每个员工的入职时间和离职时间,计算某段时间内,每天的在职人数。

起初也在网上找了一圈,但找到的都是算每月在职人数的,所以只能自己搞了,哈哈。
计算2011.01.24 到 2011.01.30每天在职人数(在职:入职当天记入,离职当天不计入),员工的入职时间和离职时间如下:
在这里插入图片描述
实现代码:

import pandas as pd
import numpy as np
from datetime import date,timedelta

# 输入起始日期,得到这个区间的日期列表
# 参数:startday-开始时间,类型datetime;endday-结束时间,类型datetime
def dayToday(startday,endday):
    day_list = []
    day_counts = (endday-startday).days + 1  #计算两个date相差天数,,加1可以把endday也计入
    for x in range(day_counts):
        new_day = startday + timedelta(days=x)
        day_list.append(new_day) #把每个日期都放在day_list中
    return day_list


if __name__ == "__main__":
    # 计算 2011.01.24 到 2011.01.30,每天的在职人数
    # 根据起止时间生成日期列表
    d1 = date(2011,1,24) 
    d2 = date(2011,1,30) 
    everyday_list = dayToday(d1, d2)
    print("{} 到 {} 的时间列表 :\n{} \n".format(d1, d2, everyday_list)) # 可以看下结果

    # 把日期列表放入dataframe,并增加一列counts(存储每天的在职人数)
    df_days_list = pd.DataFrame(everyday_list, columns = ["someday"]) # someday列存储日期
    df_days_list["counts"] = 0 # counts存储每天的在职人数,初始值设为0
    print("初始化的df_days_list is: \n{} \n".format(df_days_list)) # 可以打印查看结果

    # 员工的入职时间 和 离职时间
    # 此处随便列了几个,便于验证。也可以从csv等文件读取
    df_emp = pd.DataFrame([[date(2011,1,25),date(2011,1,29)],
                           [date(2011,1,29),date(2011,3,30)],
                           [date(2011,2,9),date(2011,3,30)],
                           [date(2011,1,14),date(2011,1,27)]],columns=["joindate","quitdate"]) # 第一列为入职时间,第二列为离职时间

    #测试的一些取值方法,可忽略
    # print(type(df_emp.loc[2]["joindate"])) #似乎不指定index名称时,此方法可以用
    # print(type(df_emp.loc[2,["joindate","quitdate"]]))
    # print(type(df_days_list["someday"]))

#     print(type(df_days_list.someday))
#     print(type(df_days_list["someday"]))

    # 对每一个员工做循环,如果在职,人数加1
    for i in range(0, len(df_emp)): 
        joindate = df_emp.loc[i]["joindate"]
        quitdate =  df_emp.loc[i]["quitdate"]
        # (在职:入职当天记入,离职当天不计入)符合条件的,给对应的日期列表的人数上加1
        # 判断条件需要注意用()括起来。逻辑:“&” -与;“|”-或
        df_days_list.loc[(df_days_list.someday>=joindate)&(df_days_list.someday<quitdate), "counts"] += 1  #success! 
        #此处 df_days_list.someday和df_days_list["someday"]哪种写法都可
    print("{} 到 {} 的在职人数情况:\n {}".format(d1,d2,df_days_list))

输出结果:
在这里插入图片描述
因为缺少对dataframe的基础知识,在循环赋值的步骤,走了不少弯路,在网上找了好多方案,终于emm…


版权声明:本文为qq_40178216原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。