Рассчитать среднее значение столбца за интервал времени - PullRequest
3 голосов
/ 13 апреля 2020

У меня есть фрейм данных

                        id      timestamp               data    gradient        Start
timestamp                                       
2020-01-15 06:12:49.213 40250   2020-01-15 06:12:49.213 20.0    0.00373         NaN 
2020-01-15 06:12:49.313 40251   2020-01-15 06:12:49.313 19.5    0.00354         0.0 
2020-01-15 08:05:10.083 40256   2020-01-15 08:05:10.083 20.0    0.00020         1.0 
2020-01-15 08:05:10.183 40257   2020-01-15 08:05:10.183 20.5    -0.00440        0.0
                            ...
2020-01-31 09:01:50.993 40310   2020-01-31 09:01:50.993 21.0    0.55473         1.0
2020-01-31 09:01:51.093 40311   2020-01-31 09:01:51.093 21.5    0.00589         0.0
                            ...

Я хочу найти среднее значение data, что l ie между start_time ==1 и 30 seconds позже.

Воспроизводимый пример:

d = {'timestamp':["2020-01-15 06:12:49.213", "2020-01-15 06:12:49.313", "2020-01-15 08:05:10.083", "2020-01-15 08:05:10.183", "2020-01-15 09:01:50.993", "2020-01-15 09:01:51.093", "2020-01-15 09:51:01.890", "2020-01-15 09:51:01.990", "2020-01-15 10:40:59.657", "2020-01-15 10:40:59.757", "2020-01-15 10:42:55.693", "2020-01-15 10:42:55.793", "2020-01-15 10:45:35.767", "2020-01-15 10:45:35.867", "2020-01-15 10:45:46.770", "2020-01-15 10:45:46.870", "2020-01-15 10:47:19.783", "2020-01-15 10:47:19.883", "2020-01-15 10:47:22.787"],
'data': [20.0, 19.5, 20.0, 20.5, 21.0, 21.5, 22.0, 22.5, 23.0, 23.5, 23.0, 22.5, 23.0, 23.5, 24.0, 24.5, 25.0, 25.5, 26], 
'gradient': [NaN, NaN, 0.000000, 0.000148, 0.000294, 0.000294, 0.000339, 0.000339, 0.000334, 0.000334, 0.000000, -0.008618, 0.000000, 0.006247, 0.090884, 0.090884, 0.010751, 0.010751, 0.332889],
'Start': [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,]
}

df = pd.DataFrame(d)

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

start_time               end_time                   Average
2020-01-15 08:05:10.083  2020-01-15 09:01:51.093    20.25  = average of (20.0, 20.5)
2020-01-15 10:45:35.767  2020-01-15 10:45:35.767    23.75  = average of (23.0, 23.5, 24.0, 24.5)


Редактировать:

Используя код @ jezrael:

df['timestamp'] = pd.to_datetime(df['timestamp'])
df['g'] = df['Start'].cumsum()

df1 = df[df['g'].ne(0)].copy()
#
s = df1.groupby('g')['timestamp'].transform('first')
df1 = df1[df1['timestamp'].between(s, s + pd.Timedelta(30, 's'))]
#
df2 = df1.groupby('g').agg(start_time=('timestamp','first'),
                           end_time=('timestamp','last'),
                           Average=('data','mean')).reset_index(drop=True)
print (df2)

Я получил вывод enter image description here

Кажется, что некоторое время начала и окончания очень близко, с разницей в 0,1 секунды. Это ошибка в устройстве сбора данных, которое каждый раз записывало 2 точки данных вместо 1, и точки данных имеют разницу 0.5 для data. Кроме того, существует очень мало точек данных, из-за которых начальное и конечное время были очень близки в течение интервала времени 30 seconds. У меня вопрос, возможно ли, если мы будем заполнять образец вперед? Чтобы было больше данных для измерения.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Попробуйте этот код.

df['timestamp'] = pd.to_datetime(df['timestamp'])

start_time_list = []
end_time_list = []
average_list = []

for start_ind in df[df['Start'] == 1].index:   
    end_ind = np.where(df['timestamp'] <= df.iloc[start_ind]['timestamp'] + pd.to_timedelta(30, unit = 's'))[0][-1] + 1    
    average = df['data'].iloc[start_ind:end_ind].mean()

    start_time_list.append(df.iloc[start_ind]['timestamp'])
    end_time_list.append(df.iloc[end_ind]['timestamp'])
    average_list.append(average)

output = pd.DataFrame({"start_time":start_time_list,
                       "end_time":end_time_list,
                       "average":average_list})
0 голосов
/ 13 апреля 2020

Получить сначала timestamp для групп по GroupBy.transform и GroupBy.first, затем сравнить по Series.between:

df['timestamp'] = pd.to_datetime(df['timestamp'])
df['g'] = df['Start'].cumsum()

df1 = df[df['g'].ne(0)].copy()
#
s = df1.groupby('g')['timestamp'].transform('first')
df1 = df1[df1['timestamp'].between(s, s + pd.Timedelta(30, 's'))]
#
df2 = df1.groupby('g').agg(start_time=('timestamp','first'),
                           end_time=('timestamp','last'),
                           Average=('data','mean')).reset_index(drop=True)
print (df2)
               start_time                end_time  Average
0 2020-01-15 08:05:10.083 2020-01-15 08:05:10.183    20.25
1 2020-01-15 10:45:35.767 2020-01-15 10:45:46.870    23.75
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...