Изменить столбец с датами в датафрейме по условию

Исходный датафрейм:

 ID    date             amount
  1    2018-09-03 17:00:00  7282.5
  2    2018-09-05 11:00:00  7111.0   
  3    2018-09-08 10:00:00  6448.0    
  4    2018-09-10 18:00:00  6377.0 
  5    2018-09-15 14:00:00  6376.5 

На вход получаю список праздничных дней holydays = [3, 4, 10, 11, 12, 13]

Нужно получить:

 ID    date                 amount
  1    2018-09-05 17:00:00  7282.5
  2    2018-09-05 11:00:00  7111.0   
  3    2018-09-08 10:00:00  6448.0    
  4    2018-09-14 18:00:00  6377.0 
  5    2018-09-15 14:00:00  6376.5

То есть если дата попадает на праздник, ее нужно изменить на следующую после праздников.

Пытался так:

df.loc[df['date'].dt.day.isin(holydays), 
           'date'] = df['date'] + datetime.timedelta(days=1)

И так:

for x in df['date']:
    while x.day in holydays:
        x = x + datetime.timedelta(days=1)

Во втором варианте похоже чего-то не хватает...


Ответы (1 шт):

Автор решения: CrazyElf

Поскольку воспроизводимые данные не представлены, пишу код без проверки. Код не оптимальный, но должен работать по идее:

while True:
    df_holydays_mask = df['date'].dt.day.isin(holydays)
    if not holidays_mask.any():
        break
    df.loc[df_holydays_mask, 'date'] = \
        df.loc[df_holydays_mask, 'date'] + datetime.timedelta(days=1)

Суть - пока в df есть праздничные дни, берём эти дни и увеличиваем все скопом на 1.

Но вообще по-хорошему праздники должны быть привязаны к полной дате, а не только к дню месяца, несколько странно у вас, что просто день берётся.

→ Ссылка