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

Подскажите пожалуйста, как вычислить средние значения для дат.
Например есть несколько массивов (два и больше) с датой (в формете 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
}


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

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
25 апр. 2024, в 11:49
25000 руб./за проект
25 апр. 2024, в 11:37
40000 руб./за проект