Элементы панд за неделю между начальной и конечной датой - PullRequest
0 голосов
/ 15 ноября 2018

Я начинаю с фрейма данных, который имеет дату начала и дату окончания, например:

ID START       END         A
0  2014-04-09  2014-04-15  5
1  2018-06-05  2018-07-01  8 
2  2018-06-05  2018-07-01  7

И я пытаюсь найти для каждой недели, сколько элементов было запущено, ноне закончился на этом этапе.Например, в приведенном выше DF:

Week-Monday N
2014-04-07  1
2014-04-14  1
2014-04-21  0
...
2018-06-04  2
...

Что-то похожее на приведенное ниже не совсем работает, поскольку выполняет только повторные выборки на дату окончания:

df = df.resample("W-Mon", on="END").sum()

Я не знаю, какобъединить оба условия: вхождения должны быть после даты начала, но до даты окончания.

1 Ответ

0 голосов
/ 15 ноября 2018

Вы можете начать отсюда:

import pandas as pd
df = pd.DataFrame({'ID':[0,1,2], 
                   'START':['2014-04-09', '2018-06-05', '2018-06-05'],
                   'END':['2014-04-15', '2018-07-01', '2018-07-01'],
                   'A':[5,8,7]})

1 - Найти номер недели для каждого SRART и каждого END и найти Week-Monday.

import datetime, time
from datetime import timedelta

df.loc[:,'startWeek'] = df.START.apply(lambda x: datetime.datetime.strptime(x,'%Y-%m-%d').isocalendar()[1])
df.loc[:,'endWeek'] = df.END.apply(lambda x: datetime.datetime.strptime(x,'%Y-%m-%d').isocalendar()[1])
df.loc[:, 'Week-Monday'] = df.START.apply(lambda x: datetime.datetime.strptime(x,'%Y-%m-%d')- timedelta(days=datetime.datetime.strptime(x,'%Y-%m-%d').weekday()))

2- Проверьте, совпадают ли они, если да, то закончились в течение той же недели.

def endedNotSameWeek(row):
    if row['startWeek']!=row['endWeek']:
        return 1
    return 0
df.loc[:,'NotSameWeek'] = df.apply(endedNotSameWeek, axis=1)
print(df)

Вывод:

   ID       START         END  A  startWeek  endWeek Week-Monday  NotSameWeek
0   0  2014-04-09  2014-04-15  5         15       16  2014-04-07            1
1   1  2018-06-05  2018-07-01  8         23       26  2018-06-04            1
2   2  2018-06-05  2018-07-01  7         23       26  2018-06-04            1

3- Groupby каждый Week-Monday, чтобы получить число дел, не завершившихся в течение одной недели.

df.groupby('Week-Monday')['NotSameWeek'].agg({'N':'sum'}).reset_index()

  Week-Monday  N
0  2014-04-07  1
1  2018-06-04  2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...