Как вычислить интервал для дат средних значений?

Подскажите пожалуйста, как вычислить средние значения для дат.
Например есть несколько массивов (два и больше) с датой (в формете UNIX_TIMESTAMP) и значением (int), например:
Массив 1:
array(
'1555349037' => 8,
'1555349027' => 11,
'1555349017' => 2 ,
...
)

Массив 2:
array(
'1555349035' => 2,
'1555349029' => 5,
'1555349017' => 9 ,
...
)


Как построить новый массив с датой (например интервал в 10 сек) и средними значениями ближайших значений к этим датам?
  • Вопрос задан
  • 103 просмотра
Решения вопроса 2
@sl0
1. Находишь минимальное и максимальное значение дат во всех массивах. (от 1555349000 до 1555349100, например).
2. Строишь новый массив по принципу min дата до max дата с шагом в 10 сек, или сколько надо.
3. Ищешь ключи во всех массивах по принципу >=дата, < дата + 10 сек. (>=1555349000 && <1555349010)
4. Вычисляешь среднее значение для всех найденных данных и сохраняешь под нужным ключом.
Ответ написан
lastuniverse
@lastuniverse
Всегда вокруг да около IT тем
Решение для одного массива:
код
// пишу на js, на php уже забыл как писать:)

// исходный массив данных
var data = {
	1555349065: 3,
	1555349059: 10,
	1555349057: 4,
	1555349047: 12,
	1555349037: 8,
	1555349027: 11,
	1555349017: 2
};




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


	// получим массив ключей (специфика js) и навсякий случай отсортируем его:)
	var times = Object.keys(data).sort();

	// начальное значение интервала времени
	var start = +times.shift();

	// следующее за начальным значение интервала времени
	var next = +times.shift();

	// конечное значение интервала времени
	var stop = +times[times.length-1];

	// зададим шаг вычислений (поставил равным 3 чтобы было интересней)
	var step = 3;



// все готово для вычисления средних значений. Тут есть несколько особенностей, по сути данная задачя является интерполяцией
// а интерполяции бывают разными. Общей особенностью любой интерполяции является то, то они не дают точный результат
// далее для вычисления средних значений я буду использовать самую простую интерполяцию - линейную

	// создадим ассоциативный массив, в который будем складывать результаты вычислений
	var result = {};

	for(var i=start; i<stop; i+=step ){
		console.log(i);
		// если долши до следующего значения
		if(i>=next){
			start = next;
			next = +times.shift();
		}

		// вычисляем промежуточное хначение (тут вся соль, и при этом это простая пропорция)))
		var dx = next-start;
		var dy = data[next]-data[start];
		var dt = i-start;
		result[i] = data[start] + dt*dy/dx; 
	}


	// выводим результат
	console.log(result);


ну и результат:
{
  '1555349017': 2,
  '1555349020': 4.7,
  '1555349023': 7.4,
  '1555349026': 10.1,
  '1555349029': 10.4,
  '1555349032': 9.5,
  '1555349035': 8.6,
  '1555349038': 8.4,
  '1555349041': 9.6,
  '1555349044': 10.8,
  '1555349047': 12,
  '1555349050': 9.6,
  '1555349053': 7.2,
  '1555349056': 4.8,
  '1555349059': 10,
  '1555349062': 6.5
}


Если необходимо решение учитывающее значения во всех массивах, просто можете объединить их скопировав ключи и их значения в один ассоциативный массив и использовать данное решение уже на объединенном массиве
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы