Группировка последовательных дат вместе - PullRequest
3 голосов
/ 02 апреля 2012

У меня есть список (многих) сотрудников в Excel / CSV, которые берут больничные, в следующем формате.Каждый больничный день получает свою собственную линию.Я хочу добавить еще один столбец «Результат», в котором указывается продолжительность больничного периода.Например, пн-вт-ср означает, что каждая из этих трех записей помечена знаком 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

1 Ответ

4 голосов
/ 02 апреля 2012
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)

sidenote: Мне кажется, что морально / прагматически неправильно считать, что, по моему личному мнению, периоды больничных дней, граничащих с выходными, потенциально могут быть на 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(...), повторяя итерацию до тех пор, пока не найдете нерабочий день, и оштрафовать человека за каждый таким образом, к выходным или выходным, прилегающим к трассе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...