Объединение данных Pandas на основе временных интервалов и расчета средних значений - PullRequest
0 голосов
/ 24 мая 2018

Сложный вопрос:

Существует два кадра данных «TimeRanges», в которых находится информация о диапазонах времени (дата начала и дата окончания с идентификатором), например:

ID  StartTime       EndTime
1   01.03.18 12:00  01.03.18 13:00 
2   01.03.18 13:00  01.03.18 13:15 
3   01.03.18 13:30  01.03.18 14:55 

Второй фрейм данных содержит столбец Времени, значения времени которого увеличиваются с частотой в одну минуту, и столбец Значения, подобные этому:

Time            Value
01.03.18 12:00  5.00
01.03.18 12:01  20.00
01.03.18 12:02  5.00
01.03.18 13:10  30.00
01.03.18 14:20  45.00

Чего я добиваюсь и не знаю, как приблизиться к задачеявляется то, что я хочу создать новый столбец AvgValue в DataRrame TimeRanges, который будет содержать функцию среднего () значений, которые эти времена находятся в интервале между StartTime и EndTime, например:

ID  StartTime       EndTime         AvgValue
1   01.03.18 12:00  01.03.18 13:00     10
2   01.03.18 13:00  01.03.18 13:15     30
3   01.03.18 13:30  01.03.18 14:55     45

* Значение 10, потому что этов интервале с 01.03.18 12:00 до 01.03.18 13:00 (01.03.18 12:00, 01.03.18 12:01, 01.03.18 12:02) и поэтому рассчитываем среднее значение только для этихзначения.

Какой будет подход для этого?лямбда-функции?или что-то еще?

Спасибо

1 Ответ

0 голосов
/ 24 мая 2018

Я добился этого с помощью resample, но это также требует немного возни, поэтому это может быть не лучшим решением.Прежде всего нам нужно, чтобы индекс имел тип DatetimeIndex, TimedeltaIndex или PeriodIndex.

# set Time to be index
df.set_index('Time', inplace=True)
# change index type to datetime
df.index = pd.to_datetime(df.index)

с использованием resample - я использовал правило 60 минут.Вы можете ознакомиться с правилами в следующей ссылке resample

new_df = df.resample('60T').mean().reset_index()

, теперь у нас есть new_df со средними значениями каждые 60 минут.нам просто нужно сделать следующее, чтобы получить его в нужном формате.

from datetime import timedelta    
new_df['EndTime'] = new_df['Time'] + timedelta(seconds=3600)

и, наконец, переименовать столбцы:

new_df.rename(columns={'Time': 'StartTime', 'Value': 'AvgValue'}, inplace=True)

Вывод:

    StartTime             AvgValue    EndTime
0   2018-01-03 12:00:00   10.0        2018-01-03 13:00:00
1   2018-01-03 13:00:00   30.0        2018-01-03 14:00:00
2   2018-01-03 14:00:00   45.0        2018-01-03 15:00:00

РЕДАКТИРОВАТЬ: На этот раз с использованием первого кадра данных (df1) для диапазонов времени вы можете сделать следующее

df1['AvgTime'] = df1.T.apply(lambda x: df.loc[x['StartTime']:x['EndTime']].mean()).T
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...