Javascript 热图的数据处理

Javascript 热图的数据处理,javascript,highcharts,heatmap,Javascript,Highcharts,Heatmap,我有一个具有15分钟间隔数据的数据集。我需要做的是按天/小时对数据进行分组,平均每小时4次(间隔15分钟) 例如,取6:00、6:15、6:30、6:45的值并将其平均,得到一个上午6点的值 我正在寻找一个关于如何处理这个问题和/或可能是我走上正确轨道的示例的一般策略(使用JS和/或lodash,矩) 此处的示例数据集: 亚克西斯将是[ “星期六”, “星期五”, "星期四",, “星期三”, "星期二",, “星期一”, “星期日” ] yAxis标签将为一天中的时间:(上午12点、凌晨1点

我有一个具有15分钟间隔数据的数据集。我需要做的是按天/小时对数据进行分组,平均每小时4次(间隔15分钟)

例如,取6:00、6:15、6:30、6:45的值并将其平均,得到一个上午6点的值

我正在寻找一个关于如何处理这个问题和/或可能是我走上正确轨道的示例的一般策略(使用JS和/或lodash,矩)

此处的示例数据集:

亚克西斯将是[ “星期六”, “星期五”, "星期四",, “星期三”, "星期二",, “星期一”, “星期日” ]

yAxis标签将为一天中的时间:(上午12点、凌晨1点、凌晨2点、凌晨3点等)

像这样: [img]https://i.stack.imgur.com/zk7jf.jpg[/img]

最终的数据结构应该是这样的。这是按小时(上面列出的四个点的平均值)、星期几和数值细分的

[
[1, 6, 553],
[2, 6, 777],
[3, 6, 654],
[4, 6, 613],
[5, 6, 551],
[6, 6, 668],
[7, 6, 647],
[8, 6, 725],
[9, 6, 703],
[10, 6, 661],
[11, 6, 745],
[12, 6, 670],
[13, 6, 770],
[14, 6, 763],
[15, 6, 705],
[16, 6, 713],
[17, 6, 693],
[18, 6, 724],
[19, 6, 724],
[20, 6, 701],
[21, 6, 710],
[22, 6, 656]
....]
最后一个值是当天小时的平均值。比如说,

{date:"2019-07-02T06:00:00.000Z",value:1271.22} {date:"2019-07-02T06:15:00.000Z",value:1771.41}, {date:"2019-07-02T06:30:00.000Z",value:1780.83}, {date:"2019-07-02T06:45:00.000Z",value:1788.13}
7月2日上午6点的平均值将等于上述4个值的平均值

因此,对于最终数据结构中的条目,它类似于:

[hour of day, day of week, the average of the four intervals within that hour]

首先,我们需要做的是按时间段分组,这意味着一天一小时,我们使用以下代码进行分组->

let byHour = {};

const groups = (() => {
const byDay = (item) => moment(item.date).format('MMM DD YYYY'),
    forHour = (item) => moment(item.date).format('MM/DD/YYYY HH:ss');
return {
    byDay,
    forHour
};
})();
const currentGroup = 'forHour';
let obj = _.groupBy(values, groups[currentGroup]);
let valuesGrouped = Object.values(obj)
要做到这一点,我们需要时刻和细节,我们要做的是格式化传入的日期,并按天时对它们进行分组,我们将它们作为键,在我们对它们进行分组后,我们想要的是它们的值,一旦我们有了值,就将其格式化为[]

 let answerArr = valuesGrouped.map((a,i,arr)=>{
  
 return [moment(a[0].date).format('hh a'),moment(a[0].date).format('DD'),a.reduce((x, y) => parseInt(x) + parseInt(y.value),0) / a.length]
 }) 
 console.log(answerArr)
PS:请记住,一旦格式化,您将使用ISO8601作为格式,并将其格式化为本地时区

主题外 就我而言,当我格式化它时,它从6月30日22:00开始


您也可以尝试使用此逻辑来实现所需的输出:

let finalOutput = [],
        curOutput = 0,
        startDay = 1,
        startHour = 4;

values.forEach((v, i) => {
    curOutput += v.value;
    i = i + 1;
    if (i % 4 === 0) {
        console.log(i)
        finalOutput.push([startHour, startDay, curOutput / 4])
        startHour += 1;
        curOutput = 0;
        
        if (startHour === 24) {
            startDay += 1;
            startHour = 0;
        }
    }
})

console.log(finalOutput)

演示:

您好,我不明白您最后的阵列应该是什么?1表示凌晨1点,6表示周日/周六,最后一个是平均值?在所有的日子里?就在那天?@Carlos1232正确。1是凌晨1点,6是星期天。在上面的帖子底部添加了澄清。你能利用这个时刻吗?或者只是本地js。是的,这一刻肯定很好
let finalOutput = [],
        curOutput = 0,
        startDay = 1,
        startHour = 4;

values.forEach((v, i) => {
    curOutput += v.value;
    i = i + 1;
    if (i % 4 === 0) {
        console.log(i)
        finalOutput.push([startHour, startDay, curOutput / 4])
        startHour += 1;
        curOutput = 0;
        
        if (startHour === 24) {
            startDay += 1;
            startHour = 0;
        }
    }
})

console.log(finalOutput)