【问题标题】:Filling timestamp gap values for ECharts为 ECharts 填充时间戳间隙值
【发布时间】:2022-01-24 04:09:58
【问题描述】:

我是 NodeJS 的新手,正在从事一个物联网项目,该项目从多个设备收集数据并使用 ECharts 显示在基于 Web 的服务上,并带有趋势线图。数据以秒为间隔存储在 MariaDB 中。 (通常每 10 秒一次)

前端请求以下数据格式显示折线图。

{
  "name": "Line Info",
  "timestamp": [
     "2021-12-23 08:19:07",
     "2021-12-23 08:19:17",
     "2021-12-23 08:19:27"
  ],
  "PowerInput": [
     3.05718,
     3.05718,
     3.05718
   ],
   "ProdRemaintime": [
     1.83674e-40,
     1.83674e-40,
     1.83674e-40
   ],
   ...
}

问题是,当设备处于非活动状态时,它会停止向 MariaDB 发送和存储数据。因此当设备再次上线时,MariaDB中的连续数据行之间会有时间间隔。

# TimeStamp PowerInput FinalDieDiameter GearOilTemp
1 2021-12-23 09:50:58.585000 3.05718 2.05 33.8511
2 2021-12-23 09:51:08.586000 3.05716 2.05 33.8511
3 2021-12-23 09:51:18.588000 3.05712 2.05 33.8511
4 2021-12-23 09:54:10.346000 1.21436 2.00 30.4218
5 2021-12-23 09:54:20.331000 1.62327 2.00 30.4971

这导致 ECharts 仅从有数据时开始显示,不包括设备离线时。 demo
(我查询的数据时间跨度为 12/21/2021 15:00 ~ 12/22/2021 11:21,但在 MariaDB 中我只有 12/21/2021 15:04:17 之前的数据。)

为了让用户看到设备上线和下线的趋势,我正在寻找解决方案来填补时间戳空白,并将空值添加到数据集。

{
  "name": "Line Info",
  "timestamp": [
     "2021-12-23 09:51:08",
     "2021-12-23 09:51:18",
     "2021-12-23 09:51:28", // add missing timestamp
     "2021-12-23 09:51:38", // add missing timestamp
     ... // add missing timestamp
     "2021-12-23 09:54:08", // add missing timestamp
     "2021-12-23 09:54:10",
     "2021-12-23 09:54:20"
  ],
  "PowerInput": [
     3.05718,
     3.05718,
     null, // add missing data as null
     null, // add missing data as null
     ... // add missing data as null
     null, // add missing data as null
     3.05718,
     3.05718
  ],
  ...
}

我之前的解决方案是先收集一个时间范围内的所有数据,然后找到时间间隔,并通过NodeJS填补缺失的时间戳和空值,以便为ECharts生成一个完整的数据集。但是当时间差距很大时,性能真的很差。有没有其他方法可以做到这一点?

** 我在 StackOverflow 上找到了这个:Fill in missing timestamp values in SQL,但我仅限于不使用额外的 SQL 内存,因此创建新表并加入它们不是我的选择。

对于如何实现这一点,我将不胜感激。

【问题讨论】:

    标签: mysql node.js database mariadb


    【解决方案1】:

    啊哈,MariaDB。见seq_1_to_10

    SELECT  "2021-12-23 09:51:08" + INTERVAL 10 * (seq-1) SECOND AS ts,
            li.PowerInput,
            ...
        FROM seq_1_to_99999 AS s
        LEFT JOIN `Line Info` AS li  ON li.timestamp = s.ts
        WHERE s.ts BETWEEN ... AND ...
    

    每天有 8640 个 10 秒间隔。 99999 可以替换为合适的数字。

    但是,我预计即使是一天的数据也足以让绘图程序窒息。考虑将数据汇总为例如 1 小时间隔以用于绘图目的。这样,您可以添加“hi”、“lo”、“avg”等。

    【讨论】:

      猜你喜欢
      • 2018-08-05
      • 2015-02-28
      • 1970-01-01
      • 2012-12-24
      • 2023-02-08
      • 1970-01-01
      • 2019-12-05
      • 1970-01-01
      • 2021-11-08
      相关资源
      最近更新 更多