Как узнать, в каком диапазоне дат находится дата l ie и присвоить соответствующие значения? - PullRequest
3 голосов
/ 13 июля 2020

У меня есть 2 dfs:

threshold

    id  meter_point_id  valid_from  valid_until     max_power_contractual
0   3   61  1969-12-31 23:00:00 2019-11-06 23:00:00 0
1   79  61  2019-11-07 00:00:00 2020-07-13 00:00:00 10

data

    id  ds  time_series_id  y
0   12858   2019-03-21 14:30:00 12858   49.25
1   12858   2019-03-21 14:15:00 12858   52.5
2   12858   2019-03-21 17:15:00 12858   49.25
3   12858   2019-03-21 13:45:00 12858   49.0
4   12858   2019-03-21 13:30:00 12858   51.75
5   22231   2019-11-11 12:00:00 22231   10.5
6   22231   2019-11-11 11:45:00 22231   10.0
7   22231   2019-11-12 09:45:00 22231   10.0
8   22231   2019-11-14 21:45:00 22231   9.5

Я хочу проверить каждую дату в столбце ds в data df против дат valid_from и valid_until в столбцах threshold. Если дата в ds лежит в диапазоне дат 1969-12-31 23:00:00 - 2019-11-06 23:00:00, я хочу получить значение max_power_contractual из threshold df и создать его как новый столбец в data df.

Ожидаемый результат

    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.5  0
2   12858   2019-03-21 17:15:00 12858   49.25 0
3   12858   2019-03-21 13:45:00 12858   49.0  0
4   12858   2019-03-21 13:30:00 12858   51.75 0
5   22231   2019-11-11 12:00:00 22231   10.5  10
6   22231   2019-11-11 11:45:00 22231   10.0  10
7   22231   2019-11-12 09:45:00 22231   10.0  10
8   22231   2019-11-14 21:45:00 22231   9.5   10

В первых 5 строках data df значения ds совпадают с диапазоном дат в первой строке threshold df, поэтому, поскольку max_power_contractual для этого диапазона дат равен 0, я хочу, чтобы это значение было в data df. Аналогично, последние строки 4 из data df, значения ds соответствуют диапазону дат во второй строке threshold df, поэтому, поскольку max_power_contractual для этого диапазона дат равен 10, я хочу, чтобы это значение в data df. ​​

Как это можно сделать?

Спасибо

1 Ответ

2 голосов
/ 13 июля 2020

Сначала преобразуйте столбцы даты в обоих фреймах данных в серию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...