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

Я хотел бы создать новый столбец, в котором будет указано, является ли запись опубликованной c праздничной или нет. Это должно выглядеть примерно так:

             datetime                    holiday
0 2019-01-01 22:00:00                  public holiday
1 2019-01-01 23:00:00                  public holiday
2 2019-01-02 00:00:00                  non-holiday
3 2019-01-02 01:00:00                  non-holiday
4 2019-01-02 02:00:00                  non-holiday

Я создал словарь, содержащий все праздники за период, который выглядит примерно так:

public_hol = {'xmas 18': '2018-12-25',
             'boxing day 18': '2018-12-25',
             'new years 19': '2019-01-01',
             'good friday 19': '2019-04-19',
             'easter monday 19': '2019-04-22',
             'may bank holiday': '2019-05-22',
             'may bank holiday2': '2019-05-27',
             'xmas 19': '2019-12-25',
             'boxing day 19': '2019-12-26',
             'new years 20': '2020-01-01'}

И это мой код:

df['holiday'] = df['datetime'].dt.date.map(public_hol).fillna('non-holiday')

Это приводит к новому столбцу, который содержит только NA и, следовательно, имеет только «не выходной» для каждой записи. Я думаю, что проблема связана с тем, как я использую словарь, или мой код не распознает формат даты ... Спасибо за помощь.

1 Ответ

1 голос
/ 15 февраля 2020

Чтобы иметь возможность использовать map(), вам необходимо, чтобы ваш словарь ключей (а не значений ) соответствовал данным в вашем DataFrame или Series.

Итак:

  1. Вам необходимо сопоставить от дат ('2018-12-25') до их имен ('xmas 18').
  2. Вам необходимо, чтобы эти даты соответствовали типу дат в Pandas (pd.Timestamp), поскольку это то, что вы отображаете.

Вы можете настроить свой текущий словарь с помощью следующая команда, которая будет инвертировать ключи и значения и преобразовывать даты в тип pd.Timestamp:

public_hol = {
    pd.to_datetime(v): k
    for k, v in public_hol.items()
}

или просто определить словарь правильно с самого начала:

public_hol = {
    pd.to_datetime('2018-12-25'): 'xmas 18',
    pd.to_datetime('2018-12-26'): 'boxing day 18',
    ...
}

(Обратите внимание, что у вас, кажется, есть некоторые опечатки в вашем словаре, у вас не должно быть одной и той же даты дважды, она может отображаться только на один праздник, в настоящее время у вас есть 2018-12-25 как для "xmas", так и для "дня бокса" »...)

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