如何按间隔将数据分组到数组中
How to group data into arrays by intervals
所以我有一个大型数据数组,其中的对象如下所示:
Row {
month_year_index: 'september_2019_2',
localcol: 2019-09-13T00:52:16.847Z,
datamap: {
Curr1_mA: 769,
Curr2_mA: 139,
Curr3_mA: 0,
P1_W: 75,
P2_W: 0,
P3_W: 0,
P_Total_W: 75,
U1N_Vx10: 2261,
U2N_Vx10: 2330,
U3N_Vx10: 2360
}
}
使用以下代码,我设法使用 lodash groupBy 函数和 momentjs 按天对所有数据进行分组,这正是我想要的,它存储在一个数组数组中,每个数组都包含带有时间戳的所有对象(称为 localcol ) 有同一天。
queryAllPartitions().then((rowResults) => {
console.log('Final Row Length', rowResults.length);
let byDay = _.groupBy(rowResults, (result) => moment(result['localcol'], 'DD/MM/YYYY').startOf('day'));
const groupInterval = 900000 // 15 min
let byTimePeriod = [];
const result = []
for (let i = 0; i < Object.entries(byDay).length; i++) { // 30
console.log("day", i)
byTimePeriod[i] = []
byTimePeriod[i] = _.groupBy((Object.entries(byDay)[i][1]), (result) => moment(result['localcol'], 'DD/MM/YYYY').startOf('minute'));
}
}
我的问题是我必须像这样在特定时间再次对它们进行分组:
- 1 分钟 = 60000 毫秒
- 5 分钟 = 300000 毫秒
- 15 分钟 = 900000 毫秒
- 1 小时 = 3600000 毫秒
我可以使用 lodash 和 momentjs 按分钟和小时对它们进行分组,如下所示:
byTimePeriod[i] = _.groupBy((Object.entries(byDay)[i][1]), (result) => moment(result['localcol'], 'DD/MM/YYYY').startOf('minute'));
或
byTimePeriod[i] = _.groupBy((Object.entries(byDay)[i][1]), (result) => moment(result['localcol'], 'DD/MM/YYYY').startOf('hour'));
但我不知道如何为其他 2 个(5 分钟和 15 分钟)做。
我查看了 momentjs 上的文档:https://momentjscom.readthedocs.io/en/latest/moment/03-manipulating/03-start-of/ 但是在尝试了很多时间之后,我认为使用 startof 可能是不可能的,我必须使用不同的方法对它们进行分组。
本质上,startOf
函数将指定的日期字段设置为零。
要按 5 分钟分组,您必须获取当前分钟数并检查它们是否在正确的时间间隔内,为此您需要获取当前分钟数 / 5 * 5。
将 5 替换为 15,持续 15 分钟。
显然这个工作从0开始间隔:
- 0-4 = 0
- 5-9 = 5
等等
(result) => moment(result['localcol'], 'DD/MM/YYYY').minutes(Math.floor(moment(result['localcol'], 'DD/MM/YYYY').minutes() / 5) * 5);;
moment(date, 'DD/MM/YYYY').minutes(minutes);
所以我有一个大型数据数组,其中的对象如下所示:
Row {
month_year_index: 'september_2019_2',
localcol: 2019-09-13T00:52:16.847Z,
datamap: {
Curr1_mA: 769,
Curr2_mA: 139,
Curr3_mA: 0,
P1_W: 75,
P2_W: 0,
P3_W: 0,
P_Total_W: 75,
U1N_Vx10: 2261,
U2N_Vx10: 2330,
U3N_Vx10: 2360
}
}
使用以下代码,我设法使用 lodash groupBy 函数和 momentjs 按天对所有数据进行分组,这正是我想要的,它存储在一个数组数组中,每个数组都包含带有时间戳的所有对象(称为 localcol ) 有同一天。
queryAllPartitions().then((rowResults) => {
console.log('Final Row Length', rowResults.length);
let byDay = _.groupBy(rowResults, (result) => moment(result['localcol'], 'DD/MM/YYYY').startOf('day'));
const groupInterval = 900000 // 15 min
let byTimePeriod = [];
const result = []
for (let i = 0; i < Object.entries(byDay).length; i++) { // 30
console.log("day", i)
byTimePeriod[i] = []
byTimePeriod[i] = _.groupBy((Object.entries(byDay)[i][1]), (result) => moment(result['localcol'], 'DD/MM/YYYY').startOf('minute'));
}
}
我的问题是我必须像这样在特定时间再次对它们进行分组:
- 1 分钟 = 60000 毫秒
- 5 分钟 = 300000 毫秒
- 15 分钟 = 900000 毫秒
- 1 小时 = 3600000 毫秒
我可以使用 lodash 和 momentjs 按分钟和小时对它们进行分组,如下所示:
byTimePeriod[i] = _.groupBy((Object.entries(byDay)[i][1]), (result) => moment(result['localcol'], 'DD/MM/YYYY').startOf('minute'));
或
byTimePeriod[i] = _.groupBy((Object.entries(byDay)[i][1]), (result) => moment(result['localcol'], 'DD/MM/YYYY').startOf('hour'));
但我不知道如何为其他 2 个(5 分钟和 15 分钟)做。 我查看了 momentjs 上的文档:https://momentjscom.readthedocs.io/en/latest/moment/03-manipulating/03-start-of/ 但是在尝试了很多时间之后,我认为使用 startof 可能是不可能的,我必须使用不同的方法对它们进行分组。
本质上,startOf
函数将指定的日期字段设置为零。
要按 5 分钟分组,您必须获取当前分钟数并检查它们是否在正确的时间间隔内,为此您需要获取当前分钟数 / 5 * 5。
将 5 替换为 15,持续 15 分钟。
显然这个工作从0开始间隔:
- 0-4 = 0
- 5-9 = 5
等等
(result) => moment(result['localcol'], 'DD/MM/YYYY').minutes(Math.floor(moment(result['localcol'], 'DD/MM/YYYY').minutes() / 5) * 5);;
moment(date, 'DD/MM/YYYY').minutes(minutes);