首页 > 解决方案 > 基于时间戳求和javascript数组

问题描述

我有 6 个 JSON,其中包含:来自功率计的时间戳值

我需要聚合 15 分钟时间戳中的值。

{
  "data": [
    [
      [
        1616968800000,
        3159.1404000000007
      ],
      [
        1616968886400,
        1288.7799999999997
      ],
      [
        1616968972800,
        522.8924999999999
      ],
      [
        1616969059200,
        446.1015
      ],
      [
        1616969145600,
        2340.1559999999995
      ]

等等...

当我聚合时,我从时间戳开始:1616968800000

所以我需要循环所有其他 JSON 数组来获取值:1616968800000 到 1616969700000

但是当时间戳在2个时间戳中间时,他必须根据时间跨度计算值。

就是计算一个功率计。

谢谢!

标签: arraysjson

解决方案


到目前为止我还没有聚合,因为不知道我该怎么做。

我正在绘制一个谷歌图表并用这个添加值:

function drawChart() {

  // 487 = Bezug
  // 486 = Lieferung
  // 504 = PV
  // 214 = Verbrauch
  var json_day = 'http://192.168.0.202:8080/db/getdata?id=dlc&eid=487,486,504,214&range=yesterday';
  var http_request_day = new XMLHttpRequest();
  try {
    // Opera 8.0+, Firefox, Chrome, Safari
    http_request_day = new XMLHttpRequest();
  } catch (e) {
    // Internet Explorer Browsers
    try {
      http_request_day = new ActiveXObject("Msxml2.XMLHTTP");

    } catch (e) {

      try {
        http_request_day = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
        // Something went wrong
        alert("Your browser broke!");
        return false;
      }

    }
  }

  http_request_day.onreadystatechange = function() {

    if (http_request_day.readyState == 4) {
      var data_line = new google.visualization.DataTable();
      data_line.addColumn('date', 'Date');
      data_line.addColumn('number', 'Verbrauch');
      data_line.addColumn('number', 'PV');
      data_line.addColumn('number', 'Bezug');
      data_line.addColumn('number', 'Lieferung');     
      var jsonObj = JSON.parse(http_request_day.responseText);

      var rows = [];

    // Verbrauch
      for (var i = 0; i < jsonObj.data[3].length; i++) {
        // console.log(i);
        var date = new Date(jsonObj.data[3][i][0]);
        var consumption = parseFloat(jsonObj.data[3][i][1]);
        date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());
        dateNew = new Date(date.getFullYear(), date.getMonth(), date.getDate());
        
        var pv = 0;
        // search PV
        for (var ii = 0; ii < jsonObj.data[2].length; ii++) {
            var date = new Date(jsonObj.data[2][ii][0]);
            if ( jsonObj.data[2][ii][0] >= jsonObj.data[3][i][0]) {
                // console.log(i + "/" + ii);
                pv = parseFloat(jsonObj.data[2][ii][1]);
                break;
            }
        }
        
        var bezug = 0;
        // search Bezug
        for (var ii = 0; ii < jsonObj.data[0].length; ii++) {
            var date = new Date(jsonObj.data[0][ii][0]);
            if ( jsonObj.data[0][ii][0] >= jsonObj.data[3][i][0]) {
                // console.log(i + "/" + ii);
                bezug = parseFloat(jsonObj.data[0][ii][1]);
                break;
            }
        }
        
        var lieferung = 0;
        // search Lieferung
        for (var ii = 0; ii < jsonObj.data[1].length; ii++) {
            var date = new Date(jsonObj.data[1][ii][0]);
            if ( jsonObj.data[1][ii][0] >= jsonObj.data[3][i][0]) {
                // console.log(i + "/" + ii);
                lieferung = parseFloat(jsonObj.data[1][ii][1]) * -1;
                break;
            }
        }
        
        data_line.addRow([date, consumption, pv, bezug, lieferung]);

      }

      var optionsLine = {
        title: 'Energieverbrauch',
        animation: {
          duration: 1000,
          easing: 'out',
          startup: true
        },
        hAxis: {
          gridlines: {
            color: 'none'
          },
          gridThickness: 4,
          format: 'HH:MM',
          color: '#AAA',
          fontName: 'Arial',
          fontSize: '1'
        },
        interpolateNulls: true,
        backgroundColor: {
          fillOpacity: 0
        },
        legendTextStyle: {
          color: '#AAA'
        },
        titleTextStyle: {
          color: '#AAA'
        },
        series: {
          0: {
            color: '#0699fa',
            lineWidth: 1
          },
          1: {
            color: '#edd409',
            lineWidth: 1
          },
          2: {
            color: '#f1ca3a'
          },
          3: {
            color: '#6f9654'
          },
          4: {
            color: '#1c91c0'
          },
          5: {
            color: '#43459d'
          },
        },
        vAxis: {
          gridlines: {
            count: -1,
            color: 'none'
          },
          gridThickness: 4,
          format: '#,###W',
          color: '#AAA',
          fontName: 'Arial',
          fontSize: '5',
          minValue: 0
        },
        explorer: {
          actions: ['dragToZoom', 'rightClickToReset'],
          axis: 'horizontal',
          keepInBounds: true,
          maxZoomIn: 4.0
        },
      };


      var container = document.getElementById('current');
      var chartArea = new google.visualization.AreaChart(container);

但是在这里,我搜索下一个时间戳并添加到第一个......这不准确或不正确。

我需要计算超过 15 分钟的功率。我想要 15 分钟的间隔

示例 2:00:00, 5kW

00:15, 12kW

00:30, 12kW

这是第一个 15 分钟 5kW,第二个 12kW

00:00, 5kW

00:07, 10kw

00:15, 12kW

00:30, 12kW

这是前 15 分钟 7.7kW,

(5*(7 60) + 10 (8 60))/(15 60)

(2100 + 4800)/900 = 7.7kW

第二个 12kW

但是我需要从时间戳循环到时间戳......并计算过去和未来的时间,因为我找到了哪个时间戳。


推荐阅读