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)

  • ^^如果“周数”的意思是1-52。但是如果“周数”是指“月内的周”,那么我们会:

  • 一个函数也需要一个月的时间:
    function getRowsByMonthWeek(行、月、周数)=>Array(行)
  • 从这些基本构建块中,我们可以编写一个例程来组装所需的数据


    那是什么样的常规

    可能是这样的:

  • 循环一年中的所有月份。这几个月我们不会查看数据,我们将对它们进行硬编码。
  • 对于每个月,我们将调用完整数据集的
    getRowsByMonth
    。调用此集合
    monthRows
  • 我们将把
    monthRows
    传递给
    getAvgTemp
    ——它不关心时间跨度是多少,它只是提取并处理它接收到的临时数据。这是我们的
    avgmontemp
    解决的问题
  • 根据您所说的“周数”,我们将把
    monthRows
    划分为更小的集合,然后将每个集合传递到
    getAvgTemp
    。(你的剧本中最难的部分是这个划分逻辑,但这并不是说它会那么难。)这给了我们你每周的平均值
  • 我们将把这些值组合成一个数据结构,并将其插入最终返回/记录的最终结构中

  • 下面是实现。这和我想象的有点不同

    最大的变化是我预先做了一些预处理,这样日期值就不需要多次解析。在这样做的同时,我还计算每行的周数。因此,week逻辑采用按周数分组行的形式,而不是按周数查询数据集

    一些注意事项:

    • 我决定“周数”的意思是“一年中的一周”
    我没有使用矩,而是在StackOverflow上找到了一个周数算法。如果你想改用矩的算法,那就去吧

    • 输出数据结构与您描述的不同
    您的示例不是有效的JSON,因此我猜测您的想法

    下面是它的一个示例:

    {
      "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文件
    您提到每个文件都有来自一个城市的数据,所以我想您将在多个文件上运行此功能。我将其设置为可以将数据文件的路径作为命令行参数传递。请注意,CLI逻辑并不复杂,因此,如果您正在做一些时髦的事情,您将度过一段不愉快的时光。做好CLI工作是一个完全不同的主题

    如果您的伦敦数据位于一个名为
    London.json
    的文件中,则您将以这种方式处理该文件并将结果保存到t