按时间间隔对时间序列数据进行分组

问题描述:

比方说,我们正在为每10秒收集一种数据类型的设备存储数据。每个设备可以位于不同的时区。快速查询以可视化数据的能力非常重要。我们可以要求系统问题,比如下面:按时间间隔对时间序列数据进行分组

1. For a specific device, I want the last 7 days of data grouped by day totals for my local timezone. 
2. For a specific device, I want the last year's data grouped by month totals for my local timezone. 

存储所有数据,UTC似乎是最干净的方法,但它要求数据的本地分组时变得非常棘手。例如,每个时区的日分组具有不同的偏移量。因此,如果我们要存储日,月,年“桶”,则它们都将按照UTC进行分组,这对于询问除UTC以外的其他时区是没有用的。

如果我们将分钟和小时“桶”中的数据进行分组(忽略不到一小时的时区,例如IST +5:30),我们可以使用小时“桶”来构造答案以上问题。对于问题2,每个分组将有12个分组,每个分组最多744小时。

有分钟和小时(忽略不到一小时的时区,例如IST +5:30)“桶”的方法是否看起来像样的设计?有没有人设计过类似的建议?

+0

提供一个字段来存储每个设备的时区,例如Java时区ID,并支持基于本地日历的日历聚合 - 此方法应该适用于上述情况。我会看看时间序列数据库。 –

是的,通过偏移量创建存储桶是一个合理的设计,并且这经常发生在数据仓库(例如)中。

虽然以1小时为增量意味着忽略许多真实的地方。正如您所指出的那样,印度是一个使用:30偏移量的位置。如果您想要覆盖世界上每个现代时区,则实际上需要按15分钟段数进行反算,因为有几个是:30:45偏移量。

当然,如果您觉得可以接受有错误的容限,那么您可以使用任何可以容忍的粒度。理论上,你可能会超过一个小时 - 你只会有一个更大的误差。

如果您想要考虑另一种方法,则可以使用设备的本地时间将值存储在date-time-offset表单中。索引此类值时,大多数数据库都将转换为UTC,因此您可能还需要一个计算列来提取和索引本地时间部分。然后,您可以在当地时间按天分组,而无需一定知道如何与UTC联系。这种方法的缺点是数据固定在原来的时区。你不能轻易重组来推断不同的时区。虽然如果这些是真实世界中的实际设备,那通常不是一个问题。

+0

仅供参考 - 您可能还想阅读:https://github.com/MicrosoftArchive/iot-journey/blob/master/docs/09-time-considerations.md –

+0

谢谢@Matt Johnson - 您提供的链接非常有帮助。 –