如果您正在处理时间序列数据,则需要一种能够轻松操作、查询和可视化该数据的方法。通常,时间序列数据库包含许多传统数据库中没有的面向时间的函数。
这些函数旨在提供两个关键优势:提高时间序列分析的易用性和提高性能。在本例中,我将使用两个TimescaleDB函数time_bucket()和time_bucket_gapfill().
这些函数与完整的 SQL 一起存在,并且可以被视为 SQL 语言的扩展。由于当今大量开发人员已经了解 SQL,因此学习曲线大大缩短。Time_bucket() 用于聚合任意大小的时间段,而当您的时间段缺少数据或间隙时,gapfill() 就很重要,这在每秒捕获 1000 个时间序列读数时很常见。
time_bucket() 的背景
本质上, time_bucket()
是标准 PostgreSQL 函数的更强大版本date_tunc()。 date_trunc
根据指定的日期部分(例如小时、周或月)“截断”TIMESTAMP 或 INTERVAL 值并返回截断的时间戳或间隔。
例如, date_trunc
可以按 1 秒、1 小时、1 天或 1 周进行聚合。然而,用户通常希望查看 5 分钟或 4 小时等的聚合。这在 SQL 中可能会变得相当复杂,但 time_bucket()
很容易。
时间分桶允许任意时间间隔(例如,5 分钟、6 小时等)以及灵活的分组和偏移,而不仅仅是秒、分钟、小时等。
除了允许更灵活的时间序列查询之外, time_bucket()
还允许您以更简单的方式编写这些查询。事实上,它知道直接从 WHERE 子句推断时间范围,这大大简化了查询语法。
正如您可以想象的那样,时间分桶对于许多场景都有帮助。在创建时间序列数据的仪表板或可视化时,许多人依靠此功能将原始观察结果转换为固定的时间间隔。
当使用Grafana等解决方案绘制时间序列数据图表时 ,聚合可以通过将原始数据分组为更高级别的聚合来帮助识别随时间变化的趋势。例如,您可能希望每天平均每月原始数据以获得更平滑的趋势线或计算非数字数据的出现次数。
使用 time_bucket_gapfill() 构建在 time_bucket() 之上
用户在处理时间序列数据时经常遇到的一个问题是以不规则或不匹配的间隔记录测量值。这会创建一个包含缺失数据或间隙的时间桶间隔。幸运的是,TimescaleDB 有一个名为 的函数 time_bucket_gapfill() ,允许您将数据聚合为连续的时间间隔。您可以选择两种不同的方式来填充间隙: locf()
向前传送时间范围内的最后一个已知值,或者 interpolate()
在间隙之间进行线性插值。
亲身体验示例应用程序
现在您已经知道了什么 time_bucket()
和 time_bucket_gapfill()
该做什么,是时候动手使用示例应用程序了!我构建了一个简单的 Python 应用程序,用于从 Open AQ Platform API(开放 API 空气质量数据)中提取数据。本质上,该应用程序读取 API 以获取一段时间内英国所有城市的空气质量值,解析结果,并将从空气质量传感器收集的所有测量值存储在 TimescaleDB 中。