Сначала преобразуйте столбцы даты в обоих фреймах данных в серию pandas datetime
, используя pd.to_datetime
:
threshold['valid_from'] = pd.to_datetime(threshold['valid_from'])
threshold['valid_until'] = pd.to_datetime(threshold['valid_until'])
data['ds'] = pd.to_datetime(data['ds'])
Затем используйте:
idx = pd.IntervalIndex.from_arrays(threshold['valid_from'], threshold['valid_until'])
mapping = threshold.set_index(idx)['max_power_contractual']
data['max_power_contractual'] = data['ds'].map(mapping)
Подробности:
ШАГ A: Создайте pd.IntervalIndex
из столбцов valid_from
и valid_until
, этот IntervalIndex будет использоваться в STEP C
для сопоставления столбца ds
:
# print(idx)
IntervalIndex([(1969-12-31 23:00:00, 2019-11-06 23:00:00], (2019-11-07, 2020-07-13]],
closed='right',
dtype='interval[datetime64[ns]]')
ШАГ B: Используйте .set_index
, чтобы установить индекс серии max_power_contractual
на этот индекс интервала idx
:
# print(mapping)
(1969-12-31 23:00:00, 2019-11-06 23:00:00] 0
(2019-11-07, 2020-07-13] 10
Name: max_power_contractual, dtype: int64
ШАГ C: Наконец, используйте Series.map
, чтобы сопоставить столбец ds
с этой серией mapping
и назначить его новому столбцу в data
.
# print(data)
id ds time_series_id y max_power_contractual
0 12858 2019-03-21 14:30:00 12858 49.25 0
1 12858 2019-03-21 14:15:00 12858 52.50 0
2 12858 2019-03-21 17:15:00 12858 49.25 0
3 12858 2019-03-21 13:45:00 12858 49.00 0
4 12858 2019-03-21 13:30:00 12858 51.75 0
5 22231 2019-11-11 12:00:00 22231 10.50 10
6 22231 2019-11-11 11:45:00 22231 10.00 10
7 22231 2019-11-12 09:45:00 22231 10.00 10
8 22231 2019-11-14 21:45:00 22231 9.50 10