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