javascript - 如何在 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 中计算数据集每日平均值的最优雅方法。有没有更优雅的方式?
任何帮助表示赞赏。
解决方案
给定日期格式 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做同样的事情。不要试图将日期字符串转换为日期,我认为没有必要。
推荐阅读
- quarkus - 在 Quarkus 中启动后台进程
- python - Model.field 上的 If 语句
- java - 检查哪个班级
- javascript - SQL Server 和 Javascript 之间的时区名称转换
- mysql - 如果字段是特定值,则 SQL SUM
- scala - 以非阻塞和惰性的方式构建带有 Futures 的 LazyList
- flutter - 当我在颤振的模型类中传递 **context** 时出现此错误 -
- reactjs - 保持前一步打开 Vertical Stepper Material-UI
- python - ValueError:时间数据“2020 年 10 月 5 日”与格式“%b %d,%Y”不匹配
- c++ - 检查 std::chrono 持续时间的惯用方法小于 0