目的:根据每个员工的入职时间和离职时间,计算某段时间内,每天的在职人数。
起初也在网上找了一圈,但找到的都是算每月在职人数的,所以只能自己搞了,哈哈。
计算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版权协议,转载请附上原文出处链接和本声明。