我在Excel / csv中有(许多)员工的名单,他们生病了,按以下格式列出。每个病假实例都有它自己的路线。我想添加另一列“结果”,它记录了病期的长度。例如,Mon-Tues-Wed表示这三个条目中的每一个都标有3。
我是python的新手,我想知道这种方法是否理想,虽然我不能看到SQL会更容易,除了为每个员工创建表(简单)然后对其进行分析(硬)
我的目标是能够在10天以上的时间内分开1天的长时间。这个跨越周末的奖励积分。
Person Date Result
A 02/04/2012 5
B 02/04/2012 2
A 03/04/2012 5
B 03/04/2012 2
A 04/04/2012 5
A 05/04/2012 5
A 06/04/2012 5
B 25/04/2012 1
A 25/04/2012 2
A 26/04/2012 2
B 30/04/2012 1
答案 0 :(得分:4)
def group(iterable):
myIter = iter(iterable)
run = [next(myIter)]
def continuesRun(x):
return run[-1]==x-1
for x in myIter:
if continuesRun(x):
run.append(x)
else:
yield run
run = [x]
yield run
演示:
>>> list( group([1,10,11,12,20,21]) )
[[1], [10, 11, 12], [20, 21]]
要将此应用于您的情况,请在伪代码中定义函数continuesRun
,如下所示:
def continuesRun(date):
previousDate = run[-1]
return previousDate==date-1day or (previousDate.weekday==Friday and previousDate==date-3day)
旁注:在我个人看来,似乎在道德上/实际上有点错误,将周末的病假跨度计算为可能延长2或4天。但如果你有充分的理由这样做,我该判断谁。 =)要对这些进行计数,请对您的运行进行后处理:如果第一天是星期一,则添加2,如果最后一天是星期五,则添加2,然后添加len(d for d in range(run[-1]-run[0]) if (run[0]+d*day).isWeekend())
。当然这不算假期,在这种情况下你会做.isHoliday() or .isWeekend()
并使{add 2}逻辑与len(...)
逻辑完全一样,通过迭代回到你找到一个非假日,并惩罚与跑步相邻的每个假日或周末的人。