Я думаю, более естественным решением является:
- Установить для индекса значение "true" datetime , полученное из Date и Время столбцы.
- Запуск al oop по индексам строк с Total == 0 .
- Получить значение из строки с индексом 1 неделю назад.
- Сохранить это значение как Всего в строке с текущим индексом.
- Наконец сбросьте индекс до того, что был раньше.
Для этого выполните:
df.set_index(pd.to_datetime(df.Date + ' ' + df.Time), inplace=True)
for ind in df[df.Total.eq(0)].index:
df.loc[ind, 'Total'] = df.loc[ind - pd.Timedelta('1W'), 'Total']
df.reset_index(drop=True, inplace=True)
Обратите внимание, что l oop должен быть основан только на индексах, а не на полных строках. Причина в том, что отключение питания может произойти в определенный день недели и час, например, через 2 (или более) недели подряд.
Так что oop основано на полных строках ( для ... в df [df] .Total.eq (0)]. Iterrows (): ) будет всегда извлекать исходных итоговых значений (обновление не будет происходить за одну неделю при обработке строки на следующую неделю (при условии, что обе эти строки содержали изначально 0 )).
Еще одно замечание
При условии, что ваши строки упорядочены по Дата / Время , ваш исходный код должен:
- См. Текущий индекс минус 168 (одна неделя до , а не после ).
- Упомянутое вычитание od 168 должно быть сделано из текущего индекса ( Index_Zero [i] ).
Таким образом, этот фрагмент кода должен быть на самом деле data.loc [(Index_Zero [i] - 168), 'Total'] .
Но мое решение устойчив к любым ошибкам петь строки в DataFrame, поэтому я советую принять решение.