将连续日期分组在一起

时间:2012-04-02 18:24:39

标签: python csv date grouping

我在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

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(...)逻辑完全一样,通过迭代回到你找到一个非假日,并惩罚与跑步相邻的每个假日或周末的人。