Найти ближайшие значения заданного интервала - PullRequest
1 голос
/ 26 июня 2019

У меня есть некоторые измерения каждые 100 мс. Я хочу уменьшить данные, выбирая данные каждые 10 секунд или, по крайней мере, самое близкое значение.

Здесь я делаю небольшую серию, например, с 10 с. Я использую цикл, но я хочу найти простой способ сделать это без.

Предложение?

import pandas as pd
import numpy as np 

data = pd.Series([0, 1, 2, 8,11,12,26,27,28,31,40,49]) 

time_span = 10 
delta_time = 3

time_10s = np.arange(0,int((max(data)//10)*10)+1,10)
index_list = []

for elt in time_10s:
    min_index = abs(data-elt).idxmin()
    min_value = abs(data-elt).min()
    if min_value < delta_time:
        index_list.append(abs(data-elt).idxmin()) 

print(data[index_list])

Я тоже пытался с некоторым модулем, но ничего не дает:

A = data % time_span < delta_time 
B = data % time_span > (time_span - delta_time)
C = A | B
D = data[C == True].index.values

Спасибо

1 Ответ

1 голос
/ 26 июня 2019

Мы можем использовать np.searchsorted -

# Get array data for better performance
a = data.to_numpy(copy=False) # data.values on older pandas versions

# Use searchsorted to get right-side closest indices for each of bins
idx0 = np.searchsorted(a,time_10s,'right')

# Get right and left side differences for each of the bins
v1 = time_10s-a[(idx0-1).clip(min=0)]
v2 = a[idx0]-time_10s

# Compare those to see which ones from the left ones are closer
# and thus adjust the indices idx0 accordingly by 1    
idx1 = idx0-(v1<v2)

# Use those indices to get the indexed data and keep the valid ones
# based on the threshold delta_time    
data_f = data[idx1]
out = data_f[np.abs(data_f-time_10s)<delta_time]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...