Панды: стандартизировать нерегулярные интервалы времени - PullRequest
0 голосов
/ 05 сентября 2018

Мне интересно, есть ли в Pandas какие-то встроенные функции, позволяющие брать случайные промежутки времени (примерно часы) и преобразовывать их в стандартные часы. Пример кода и нерабочая попытка:

import pandas as pd

df = pd.DataFrame({'start': ['2018-09-04 01:12', '2018-09-04 02:11'], 
                   'end'  : ['2018-09-04 02:10','2018-09-04 03:20'], 
                   'val'  : [500, 600]})[['start','end','val']]

df[['start','end']] = df[['start','end']].apply(pd.to_datetime)

дает нам:

           start               end  val
2018-09-04 01:12  2018-09-04 02:10  500
2018-09-04 02:11  2018-09-04 03:20  600

и

df = df.resample('1H', on = 'start', ).reset_index()

в идеале (но не) дает:

           start               end     val
2018-09-04 01:00  2018-09-04 01:59  406.78
2018-09-04 02:00  2018-09-04 02:59  513.22
2018-09-04 03:00  2018-09-04 03:59  180.00

Я мог бы написать какой-нибудь хак для этой работы, но подумал, что у Панд есть какая-то простая функция, которая делает это.

1 Ответ

0 голосов
/ 05 сентября 2018

Это не достаточно распространенное выделение, чтобы оправдать свой собственный метод. Вы делаете прямое линейное распределение каждого входного интервала, разбитого на час. В первом интервале у вас записано всего 59 минут, поэтому «значение» каждой минуты равно 500/59 (8,47+). Во-вторых, это 600/50 в минуту (12,0).

Вы можете сделать это с относительно простой структурой управления, хотя индивидуальный анализ немного "многословен". При создании новых строк используйте оператор shift для адресации как текущей, так и предыдущей строк во входном фрейме данных. Вам необходимо отслеживать точку останова (верхнюю часть часа) для каждой строки и выполнять это линейное вычисление для обоих. Ваша арифметика выглядит примерно так:

TIME          VALUE
1:00 - 2:00   (1:12 - 1:00) * 0 + (2:00 - 1:12) * 500/59
2:00 - 3:00   (2:11 - 2:00) * 500/59 + (3:00 - 2:11) * 600/50
3:00 - 4:00   (3:20 - 3:00) * 600/50 + (4:00 - 3:20) * 0

Можете ли вы превратить эти данные в код, который вам нужен?

...