Скажем, у меня есть фрейм данных, который выглядит следующим образом:
usage_price
2017-04-01 00:00:00 1
2017-04-01 00:30:00 1
2017-04-01 01:00:00 1
2017-04-01 01:30:00 1
2017-04-01 02:00:00 1
... ...
2018-12-31 22:00:00 1
2018-12-31 22:30:00 1
2018-12-31 23:00:00 1
2018-12-31 23:30:00 1
Я хочу обновить usage_price
для определенных полей.В моем случае я хочу обновить на основе этого объекта:
{'day': '1', 'timerange': ['01 01 00:00', '31 12 08:00']}
Что означает:
- Обновить все понедельники ('день': '1')
- Между 00:00 и 08:00
- В любой понедельник с 01-01 (1 января) и 31-12 (31 декабря) ( без учета года )
Я знаю, как сделать некоторые из этих вещей отдельно:
df_timeseries[df_timeseries.index.weekday==0, 'usage_price]
df_timeseries.loc[df_timeseries.between_time('00:00', '08:00', include_end=False).index,'usage_price']
НоЯ немного застрял в том, как получать строки между датами (игнорируя годы) и как комбинировать все вместе, поэтому помощь будет принята с благодарностью!
Редактировать: Это как далекоМне удалось получить, но я не могу заставить его работать (я получаю синтаксические ошибки), я не думаю, что собираюсь корректно построить маску:
def _create_mask_from_tpr(self, df: pd.DataFrame, tpr: Dict[str, Union[str, List[str]]]) -> Tuple:
print(tpr)
weekday = int(tpr['day']) - 1 # Offset.
start_day, start_month, start_time = tpr['timerange'][0].split(" ")
end_day, end_month, end_time = tpr['timerange'][1].split(" ")
start_year, end_year = df.index.min().year, df.index.max().year
selection_weekday = (df.index.weekday == weekday)
selection_time = (df.between_time(start_time, end_time))
selection_date = None
for year in range(start_year, end_year + 1):
start_date = pd.to_datetime("{}-{}-{}".format(year, start_month, start_day))
end_date = pd.to_datetime("{}-{}-{}".format(year, end_month, end_day))
selection_date = selection_date | (df.index.date() >= start_date & df.index.date() <= end_date)
mask = (selection_weekday & selection_time & selection_date)
print(mask)