【问题标题】:Grouping consecutive dates together将连续日期组合在一起
【发布时间】:2012-04-16 10:12:55
【问题描述】:

我在 Excel/csv 中有一个(许多)员工的名单,他们请病假,按以下格式列出。每个病假实例都有自己的线路。我想添加另一列“结果”,它记录了病假的长度。例如,Mon-Tues-Wed 意味着这三个条目中的每一个都被标记为 3。

我是 python 新手,我想知道这种方法是否理想,虽然我看不出 SQL 会更容易,除了为每个员工创建表(简单)然后对其进行分析(困难)

我的目标是能够将 1 天长的周期与 10 天以上的周期分开。跨周末的奖励积分。

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

【问题讨论】:

    标签: python csv date grouping


    【解决方案1】:
    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() 并使“添加 2”逻辑与 len(...) 逻辑完全相同,通过迭代直到找到非假期,并为每个人惩罚该人假期或周末,因此与跑步相邻。

    【讨论】:

    • 你真的不需要调用continuesRun()函数的开销——如果你不打算做任何花哨的事情,只需在for循环中使用if run[-1]==x-1:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    相关资源
    最近更新 更多