Javascript 确定一系列数据的平均值
我收集了一系列天气数据,如下所示:Javascript 确定一系列数据的平均值,javascript,json,momentjs,Javascript,Json,Momentjs,我收集了一系列天气数据,如下所示: const数据=[{ “城市名称”:“伦敦”, “lat”:51.507351, “lon”:-0.127758, “主要”:{ “温度”:289.89, “最低温度”:288.468, “最高温度”:291.15, “感觉像”:287.15, “压力”:1004, “湿度”:77 }, “风”:{“速度”:5.1,“度”:230}, “云”:{“全部”:90}, “天气”:[ { “id”:804, “主要”:“云”, “说明”:“阴云”, “图标”:“04
const数据=[{
“城市名称”:“伦敦”,
“lat”:51.507351,
“lon”:-0.127758,
“主要”:{
“温度”:289.89,
“最低温度”:288.468,
“最高温度”:291.15,
“感觉像”:287.15,
“压力”:1004,
“湿度”:77
},
“风”:{“速度”:5.1,“度”:230},
“云”:{“全部”:90},
“天气”:[
{
“id”:804,
“主要”:“云”,
“说明”:“阴云”,
“图标”:“04n”
}
],
“dt”:1593561600,
“dt_iso”:“2020-07-01 00:00:00+0000 UTC”,
“时区”:3600
},
...
];
在过去的40年中,该数据以升序(逐小时)继续显示。(示例:)-整个数据集超过140MB
从这些数据中,我想获得整个数据集中每月和每周的平均温度(object.main.temp)。
我试图用我的数据回答的问题是:
过去40年一月的平均气温是多少。
过去40年二月的平均气温是多少。
(获取1月份每周的温度,除以周数,对数据集中的所有其他1月份重复此操作,并将其平均) 在剩余的几个月内重复此操作。
我打算在解析数据后创建的输出是:
{
[
“一月”:{
“周数”:{
“avgWeekTemp”:100.00
}
“平均月温度”:69.00,
...
},
...
]
}
对象的城市名称和结构始终相同,在本例中为伦敦
// build a unique number of months
// work through our data to work out the week numbers
// work through the data once again and place the data in the right week inside finalOutput
// work through the final output to determine the average values
不幸的是,我不是很精通JavaScript,所以我无法克服第二个障碍:
"use strict";
const moment = require("moment");
const data = require("./data.json");
let months = [
{
January: [],
},
{
February: [],
},
{
March: [],
},
{
April: [],
},
{
May: [],
},
{
June: [],
},
{ July: [] },
{ August: [] },
{ September: [] },
{ October: [] },
{ November: [] },
{ December: [] },
];
const finalOutput = [];
finalOutput.push(...months);
data.forEach((object) =>
finalOutput.forEach((month) => {
if (
Object.keys(month)[0] === moment(new Date(object.dt_iso)).format("MMMM")
) {
[month].push(object.dt_iso);
}
})
);
console.log(finalOutput);
它只返回了月份数组,每个月都没有任何内容
[
{ January: [] },
{ February: [] },
{ March: [] },
{ April: [] },
{ May: [] },
{ June: [] },
{ July: [] },
{ August: [] },
{ September: [] },
{ October: [] },
{ November: [] },
{ December: [] }
]
如何计算整个数据集中每周和每月的平均值?我将为您编写脚本,但在您等待时,这里有一些高级指导 首先,让我们研究一下你的数据。每行是每小时一次的天气测量。因此,您想要的每个数据点都将是这些行集合上的聚合。我们应该按照以下思路组织脚本:
function getAvgTemp(rows)=>Number
function getRowsByMonth(month)=>Array(rows)
function getRowsByWeekNumber(rows,weekNumber)=>Array(rows)
function getRowsByMonthWeek(行、月、周数)=>Array(行)
那是什么样的常规 可能是这样的:
getRowsByMonth
。调用此集合monthRows
monthRows
传递给getAvgTemp
——它不关心时间跨度是多少,它只是提取并处理它接收到的临时数据。这是我们的avgmontemp
解决的问题monthRows
划分为更小的集合,然后将每个集合传递到getAvgTemp
。(你的剧本中最难的部分是这个划分逻辑,但这并不是说它会那么难。)这给了我们你每周的平均值下面是实现。这和我想象的有点不同 最大的变化是我预先做了一些预处理,这样日期值就不需要多次解析。在这样做的同时,我还计算每行的周数。因此,week逻辑采用按周数分组行的形式,而不是按周数查询数据集 一些注意事项:
- 我决定“周数”的意思是“一年中的一周”
- 输出数据结构与您描述的不同
{
"JUNE": {
"avgMonthTemp": 289.9727083333334,
"avgWeekTemps": {
"25": 289.99106382978727,
"26": 289.11
}
},
"JULY": {
"avgMonthTemp": 289.9727083333334,
"avgWeekTemps": {
"27": 289.99106382978727,
"30": 289.11
}
}
}
输出将包括每个月的顶级条目,无论该月是否有任何数据。但是,avgWeekTemps
hash将只包含数据中存在的周的条目。当然,这两种行为都可以改变
- 它是一个可重用的脚本,可以以您共享的格式处理任意JSON文件
London.json
的文件中,则您将以这种方式处理该文件并将结果保存到t