首页 > 解决方案 > 如何在 JavaScript 中从具有每小时值的数据集中计算每日平均值

问题描述

我有一个这样的数据集:

var ds = [
{time: "t1", parameter_q: "value1"},
{time: "t2", parameter_q: "value2"},
{time: "t3", parameter_q: "value3"},
....
];

数据集包含每小时值,日期/时间格式为 dd/mm/yyyy hh:mm:ss

我正在寻找一种使用老式 JavaScript 计算值(属性 parameter_q)的每日平均值的方法。

我已经开始使用这样的功能:

function calcDAvg(ds) {

for (var i = 0; i < ds.length ; i++){
    ds[i].uday = (ds[i].xtime.getMonth() + 1) + "/" + ds[i].xtime.getDate() + "/" + ds[i].xtime.getFullYear();
};

var dailyaverage = [];
var avgqarray = [];
var hourAry = [];
var checkday = undefined;
//defining temporal array
var tmpAry = [];
var hours = 0;

for (var i = 0; i < ds.length ; i++) {

    var tmpObj = new Object();
    var iday = ds[i].uday;
    if (iday != checkday ) {
        avgqarray.push(foo);    //foo: function to calculate the average of tmpAry
        tmpObj.xtime = new Date(iday);
        dailyaverage.push(tmpObj);

        tmpAry = [];
        checkday = iday;
        tmpAry.push(ds[i].parameter_q);
        hourAry.push(hours);
        hours = 1;

    } else {
        tmpAry.push(ds[i].parameter_q);
        hours++;
    }
}

return dailyaverage;
}

我注意到数据集中的最后一个时间步被忽略了,这不是我所期望的。否则,我无法相信这是在 JavaScript 中计算数据集每日平均值的最优雅方法。有没有更优雅的方式?

任何帮助表示赞赏。

标签: javascriptaverage

解决方案


给定日期格式 dd/mm/yyyy hh:mm:ss,您可以按日期部分分组,然后计算平均值,例如

var ds = [
{time: "01/06/2018 10:00:00", parameter_q: "25"},
{time: "01/06/2018 11:00:00", parameter_q: "30"},
{time: "01/06/2018 12:00:00", parameter_q: "35"},
{time: "02/06/2018 10:00:00", parameter_q: "28"},
{time: "02/06/2018 11:00:00", parameter_q: "38"},
{time: "02/06/2018 12:00:00", parameter_q: "48"}
];

function getAverages(data) {
  var sums = data.reduce(function(acc, obj) {
    var date = obj.time.split(' ')[0];
    if (!acc[date]) {
      acc[date] = {sum:0, count:0};
    }
    acc[date].sum += +obj.parameter_q;
    acc[date].count++;
    return acc;
  }, Object.create(null));
  return Object.keys(sums).map(function(date) {
    return {[date]:sums[date].sum/sums[date].count};
  });
}

console.log(getAverages(ds));

你可以用forEach做同样的事情。不要试图将日期字符串转换为日期,我认为没有必要。


推荐阅读