热图的数据处理

时间:2020-07-07 15:26:24

标签: javascript highcharts heatmap

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

例如,取6:00、6:15、6:30、6:45的值并将其取平均值以得出一个6 AM值。

我正在寻找一种通用的方法来解决这个问题和/或可能使我走上正轨的示例(使用JS和/或lodash,时刻)

[
{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},
{date:"2019-07-02T07:00:00.000Z",value:1805.31},
{date:"2019-07-02T07:15:00.000Z",value:1781.83},
{date:"2019-07-02T07:30:00.000Z",value:1764.17},
{date:"2019-07-02T07:45:00.000Z",value:1721.44},
{date:"2019-07-02T08:00:00.000Z",value:1712.92},
{date:"2019-07-02T08:15:00.000Z",value:1764.63},
{date:"2019-07-02T08:30:00.000Z",value:1759.03},
{date:"2019-07-02T08:45:00.000Z",value:1754.27},
{date:"2019-07-02T09:00:00.000Z",value:1745.81}
....
]

此处设置的示例数据: Full example dataset here

yAxis将为[ '星期六', '星期五', '星期四', '星期三', '星期二', '星期一', '星期日' ]

yAxis标签将是一天中的时间:(12 AM,1 AM,2 AM,3 AM等)

像这样: [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]

2 个答案:

答案 0 :(得分:1)

要首先接近它,我们需要做的是按照其表示日间的时间段进行分组,我们使用以下代码进行操作->

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)

要做到这一点,我们需要时刻和Lodash,我们要做的是格式化输入的日期并将其按“日-小时”分组,将它们作为键,将它们分组后,我们想要的是它们的值,一旦值,将其格式设置为[]

 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作为格式,则将其格式化为本地timeZone。

Offtopic 就我而言,当我格式化它时,它是从6月30日22:00开始的。

CodePen link

答案 1 :(得分:0)

您也可以尝试使用以下逻辑来获得所需的输出:

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)

演示:https://jsfiddle.net/BlackLabel/ut1yzx6s/