Изменить столбец с датами в датафрейме по условию
Исходный датафрейм:
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.
Но вообще по-хорошему праздники должны быть привязаны к полной дате, а не только к дню месяца, несколько странно у вас, что просто день берётся.