将不连续的时间数据转换成连续数据,并根据预设最小单位区间对数据分段统计求和

问题

在做项目的过程中需要根据时间绘制折线图,但由于数据不连续,所以后端返回的数据会有一些时间片段有缺失,在画图的时候需要把这些缺失时间补充完成,并给他们赋空值

解决方法

思路很简单,就是遍历已有数据,对缺失的时间数据进行填充

// 输入格式
// inputData: [{Time: xxx, Value: yyy}]
// timeInterval: [moment(), moment()]

// 使用了moment.js,请自行引入

function solution(inputData,timeInterval) {
  const start = timeInterval[0].clone()
  const end = timeInterval[1].clone()
  const data = []

  let timeLevel = ''
  let interval = 5
  let timeConf = {}
  let sum = 0
  let isSave = true
  
  if (end.diff(start, 'days') <= 1) {
    timeConf = { second: 0 }
    timeLevel = 'minutes'
    interval = 5
  } else {
    timeConf = { hour: 0, minute: 0, second: 0 }
    timeLevel = 'days'
    interval = 1
  }

  start.set(timeConf)
  end.set(timeConf)

  const dataFormatStr = `YYYY-MM-DD${timeLevel === 'days' ? '' : ' HH:mm:00'}`
  const temp = start
  for (let i = 0; i < inputData.length;) {
    const diff = temp.diff(moment(inputData[i].Time), timeLevel)
    if (diff < 0) {
      const t = temp.format(dataFormatStr)
      let value = 0
      if (!isSave) {
        value = sum
        isSave = true
        sum = 0
      }
      data.push({
        Time: t,
        Value: value,
      })
      temp.add(interval, timeLevel)
    } else {
      if (diff < interval && diff > 0) {
        sum += inputData[i].Value
        isSave = false
      } else {
        if (diff === 0) {
          sum += inputData[i].Value
        }
        data.push({
          Time: temp.format(dataFormatStr),
          Value: sum,
        })
        isSave = true
        sum = diff === 0 ? 0 : inputData[i].Value
        temp.add(interval, timeLevel)
      }
      i += 1
    }
  }
  if (!isSave) {
    data.push({
      Time: temp.format(dataFormatStr),
      Value: sum,
    })
    temp.add(interval, timeLevel)
  }
  while (temp.diff(end, timeLevel) <= 0) {
    data.push({
      Time: temp.format(dataFormatStr),
      Value: 0,
    })
    temp.add(interval, timeLevel)
  }
  return data
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZTao-z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值