Сравнение дат в списке с диапазонами дат в кадре данных - PullRequest
0 голосов
/ 18 февраля 2019

У меня возникают трудности с поиском способа подсчёта случаев праздников между диапазонами даты и времени в кадре данных.Праздники находятся в списке, а диапазоны даты и времени находятся в кадре данных, как показано ниже: (обратите внимание, что это подмножество очень большого набора данных)

df = pd.DataFrame({'Date': ['2018-12-19 18:47','2019-01-01 06:11','2019-01-12 10:05','2019-02-17 14:22','2019-03-08 16:17','2019-03-25 17:35','2019-02-14 17:35'],
              'End Date': ['2018-12-28 18:47','2019-01-05 06:11','2019-01-16 10:05','2019-02-19 14:22','2019-03-12 16:17','2019-03-26 17:35','2019-05-27 17:35']})

df['Date'] = pd.to_datetime(df['Date'])
df['End Date'] = pd.to_datetime(df['End Date'])

Holidays = [date(2018,12,24),date(2018,12,25),date(2019,1,1),date(2019,1,21),date(2019,2,18),date(2019,3,8),date(2019,5,27)]

Мне удалось найти способкоторые определяют, находится ли выходной в пределах диапазонов даты и времени, но не получают фактическое число.

Есть ли способ изменить приведенный ниже код, чтобы собрать счетчик, а не логические значения?

Это то, что я пробовал до сих пор:

df['Holidays'] = [any([(z>=x)&(z<=y) for z in Holidays]) for x , y in zip(df['Date'].dt.date,df['End Date'].dt.date)]

Результат, который я ищу, выглядит следующим образом:

result = pd.DataFrame({'Date': ['2018-12-19 18:47','2019-01-01 06:11','2019-01-12 10:05','2019-02-17 14:22','2019-03-08 16:17','2019-03-25 17:35','2019-02-14 17:35'],
                   'End Date': ['2018-12-28 18:47','2019-01-05 06:11','2019-01-16 10:05','2019-02-19 14:22','2019-03-12 16:17','2019-03-26 17:35','2019-05-27 17:35'],
                   'Holidays': [2,1,0,1,1,0,3]})

1 Ответ

0 голосов
/ 18 февраля 2019

Мы можем создать функцию, которая проверяет это условие, а затем apply по строкам.

def fn(series):
    return sum([series.iloc[0] <= h <= series.iloc[1] for h in Holidays])

df.assign(Holidays=df.apply(fn, axis=1))

                 Date            End Date  Holidays
0 2018-12-19 18:47:00 2018-12-28 18:47:00         2
1 2019-01-01 06:11:00 2019-01-05 06:11:00         0
2 2019-01-12 10:05:00 2019-01-16 10:05:00         0
3 2019-02-17 14:22:00 2019-02-19 14:22:00         1
4 2019-03-08 16:17:00 2019-03-12 16:17:00         0
5 2019-03-25 17:35:00 2019-03-26 17:35:00         0
6 2019-02-14 17:35:00 2019-05-27 17:35:00         3

Ваш желаемый вывод неверен, потому что в списке Holidays нет часов для какой-либо датыметки времени.Чтобы получить вывод, который вы разместили, нам нужно округлить до дня.

def fn(series):
    return sum([series.iloc[0].floor('d') <= h <= series.iloc[1].floor('d') for h in Holidays])

df.assign(Holidays=df.apply(fn, axis=1))

               Date          End Date  Holidays
0  2018-12-19 18:47  2018-12-28 18:47         2
1  2019-01-01 06:11  2019-01-05 06:11         1
2  2019-01-12 10:05  2019-01-16 10:05         0
3  2019-02-17 14:22  2019-02-19 14:22         1
4  2019-03-08 16:17  2019-03-12 16:17         1
5  2019-03-25 17:35  2019-03-26 17:35         0
6  2019-02-14 17:35  2019-05-27 17:35         3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...