Создать новый столбец с категориальными переменными на основе диапазона дат - PullRequest
1 голос
/ 14 февраля 2020

Если у меня есть данные, подобные этим, с датами дневных временных рядов за год (2019) -

datetime
0   15.02.19 13:00
1   15.02.19 14:00
2   15.02.19 15:00
3   15.02.19 16:00
4   15.02.19 17:00

И я хочу создать новый столбец со значением «школьные каникулы», если мой datetime находится в пределах диапазона (школьные каникулы с 2019 года) и «time term», иначе как бы я подошел к этому наиболее эффективным способом? Результирующий кадр данных должен выглядеть примерно так:

datetime    school holiday
0   15.02.19 13:00  Term time
1   15.02.19 14:00  Term time
2   15.02.19 15:00  Term time
3   15.02.19 16:00  Term time
4   15.02.19 17:00  School Holiday

Я думал, что я возьму даты школьных каникул, которые будут примерно такими:

Autumn Half Term Holidays   21 Oct 2019 - 25 Oct 2019
Winter Holidays             23 Dec 2019 - 3 Jan 2020
etc...

И составим словарь с эти даты, то как-то использовать ламбу применять? По сути, эта функция должна быть - если datetime == holiday_range: 'school holiday' else: 'Term time'.

Спасибо за вашу помощь

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Может быть, это будет полезно:

holidays = {'Autumn Half Term Holidays': ('16 Feb 2019', '25 Feb 2019')}
holidays_map = {date.date(): holiday for holiday, dates in holidays.items() for date in pd.date_range(*dates)}

df['holiday'] = df['datetime'].dt.date.map(holidays_map).fillna('Term time')

df

             datetime                    holiday
0 2019-02-15 13:00:00                  Term time
1 2019-02-15 14:00:00                  Term time
2 2019-02-15 15:00:00                  Term time
3 2019-02-15 16:00:00                  Term time
4 2019-02-16 17:00:00  Autumn Half Term Holidays
1 голос
/ 14 февраля 2020

Возможно, в вашем DataFrame больше строк, чем уникальных праздников. Для таких проблем вам, вероятно, понадобится l oop где-то, так что лучше l oop для меньшего числа праздников

. Преобразуйте даты в datetime dtype, и давайте сохраним праздники в отдельный DataFrame, снова с datetime dtype

import pandas as pd
df['datetime'] = pd.to_datetime(df['datetime'], format='%d.%m.%y %H:%M')

df2 = pd.DataFrame({'Holiday': ['Autumn Half Term Holidays', 'Winter Holidays'],
                    'start': pd.to_datetime(['2019-10-21', '2019-12-23']),
                    'end': pd.to_datetime(['2019-10-25', '2020-01-03'])})

Теперь, чтобы определить, является ли что-то выходным, мы проверяем, находится ли дата / время между любым периодов. Карта просто получает ваши метки вместо True / False. Я добавил строку в ваш пример, учитывая ваши праздники, чтобы проиллюстрировать, что он работает.

...