2015-02-10 6 views
3

Вопрос, но я не смог найти простой ответ.Как перенастроить/уменьшить размер нерегулярного списка времени?

У меня есть список данных, который отсчитывает время в секундах, что события происходят:

[200.0 420.0 560.0 1100.0 1900.0 2700.0 3400.0 3900.0 4234.2 4800.0 etc..] 

Я хочу, чтобы подсчитать, сколько событий происходит каждый час (3600 секунд) и создать новый список этих пунктов.

Я понимаю, что это называется понижающей дискретизацией, но вся информация, которую я могу найти, связана с традиционными временными рядами.

Для примера выше новый список будет выглядеть так:

[7 3 etc..] 

Любая помощь будет принята с благодарностью.

ответ

1
all_events = [ 
    200.0, 420.0, 560.0, 1100.0, 1900.0, 2700.0, 3400.0, 3900.0, 4234.2, 4800.0] 

def get_events_by_hour(all_events): 
    return [ 
     len([x for x in all_events if int(x/3600.0) == hour]) 
     for hour in xrange(24) 
    ] 

print get_events_by_hour(all_events) 

Обратите внимание, что all_events должны содержать события за один день.

+0

Отлично, спасибо за помощь. Любой способ удалить отметку часа на выходе, то есть часть вывода «0:» «1:»? – bobo

+0

Конечно, я отредактировал ответ. –

+0

Большое спасибо. – bobo

1

Акт выборки означает получение данных f_i (образцы) в определенные дискретные моменты времени t_i. Число выборок на единицу времени дает частоту дискретизации. Downsampling - это особый случай передискретизации, что означает сопоставление выборочных данных с другим набором точек выборки t_i', здесь на один с меньшей частотой дискретизации, что делает образец более грубым.

Ваш первый список, содержащий точки отбора проб t_i (единица секунд), и косвенно количество событий n_i, которое соответствует индексу i, например n_i = i + 1.

Если вы уменьшаете список раз в то время, после периодического времени T (единица измерения в секундах), вы передискретизацию к новому набору n_i' времен t_i' = i * T. Я не записывал понижающую дискретизацию, потому что ничто не могло произойти за время T, что означает повышение частоты дискретизации, поскольку теперь вы получаете больше данных.

Для расчета вы проверяете, пуст ли входной список, в этом случае n' = 0 должен войти в ваш список результатов. В противном случае у вас есть m записей в списке ввода, измеренных в течение долгого времени T и вы можете использовать приведенное ниже уравнение:

n' = m * 3600/T

выше n' будет идти в свой список вывода, это масштабируется до событий в час.

+0

Спасибо, что очень полезная информация. Я не понимал, что подсчет 0 будет классифицирован как upsampling! – bobo

1

Вопрос имеет знак scipy, а scipy зависит от numpy, поэтому я принимаю ответ с использованием numpy.

Чтобы получить час, связанный с временной меткой t, вы можете взять целую часть t/3600. Затем, чтобы получить количество событий за каждый час, вы можете подсчитать количество вхождений этих целых чисел. Функция numpy bincount может сделать это для вашего.

Ниже приведено одноразовое число для расчета.Я поставил временные метки в Numpy массиве t:

In [49]: t = numpy.array([200.0, 420.0, 560.0, 1100.0, 1900.0, 2700.0, 3400.0, 3900.0, 4234.2, 4800.0, 8300.0, 8400.0, 9500.0, 10000.0, 14321.0, 15999.0, 16789.0, 17000.0]) 

In [50]: t 
Out[50]: 
array([ 200. , 420. , 560. , 1100. , 1900. , 2700. , 
     3400. , 3900. , 4234.2, 4800. , 8300. , 8400. , 
     9500. , 10000. , 14321. , 15999. , 16789. , 17000. ]) 

Вот ваш расчет:

In [51]: numpy.bincount((t/3600).astype(int)) 
Out[51]: array([7, 3, 4, 1, 3])