【问题标题】:Time averaging non-continuous data with PostgreSQL9.2使用 PostgreSQL9.2 对非连续数据进行时间平均
【发布时间】:2014-02-17 12:46:47
【问题描述】:

我有多个 1 秒时间分辨率真实数据的数据集。这些数据通常会在仪器丢弃数据的时间序列中或仪器关闭时出现间隙,从而导致数据集不完整(尽管仍然非常有用)。生成的数据可能如下所示

Timestamp [timestamp] : datastream1 [double precision] : datastream2 [double precision] : etc
2011-01-01 00:00:01     153.256     1255.325 
2011-01-01 00:00:02     152.954     1254.288 
2011-01-01 00:00:03     151.738     1248.951 
2011-01-01 00:00:04     150.015     1249.185 

2011-01-01 00:10:08     179.132     1328.115
2011-01-01 00:10:09     178.051     1323.125
2011-01-01 00:10:10     180.870     1336.983

2011-01-04 09:19:02     152.198     1462.814
2011-01-04 09:19:03     158.014     1458.122
2011-01-04 09:19:04     156.070     1464.174

请注意:这些数据通常是连续的,但会有必须处理的随机间隙。

我需要编写代码来获取给定时间间隔“timeInt”的平均值和标准偏差,以便能够处理这些差距。例如,如果我想要一个 10 分钟的平均数据,我需要的输出是:

Timestamp_10min   :   avg_data1   :   med_data1   :   count_data1

其中 avg_data1 将是给定 10 分钟内所有数据点的平均值,count_data1 将是用于计算该平均值的点数(即,如果没有丢失数据,则为 600,如果每秒为 300点丢失等)。

此代码需要使用任何所需的输入间隔(即 x 分钟、y 天、z 周、月、年等)。

目前我只能使用以下代码输出分钟平均值。

CREATE OR REPLACE VIEW "DATATABLE_MIN" AS
  SELECT MIN("DATATABLE"."Timestamp") AS "Timestamp_min",
        avg("DATATABLE"."datastream1") AS "datastream1_avg_min",
        stddev("DATATABLE"."datastream1") AS "datastream1_stdev_min",
        count("DATATABLE"."datastream1") AS "datastream1_avg_min"
      FROM "DATATABLE"
  GROUP BY to_char("DATATABLE"."Timestamp",'YYYY-MM-DD HH24:MI'::text);

提前感谢您的帮助!

【问题讨论】:

  • 所以你要指定区间!这意味着您想创建一个存储过程,您可以将间隔作为参数传递给它,对吧?

标签: sql postgresql time-series scientific-computing group-by


【解决方案1】:

要按 10 分钟分组,您可以使用“epoch”:

  SELECT MIN(dt."Timestamp") AS "Timestamp_min",
         avg(dt."datastream1") AS "datastream1_avg_min",
         stddev(dt."datastream1") AS "datastream1_stdev_min",
         count(dt."datastream1") AS "datastream1_avg_min"
  FROM "DATATABLE" dt
  GROUP BY trunc(extract(epoch from dt."TimeStamp") / (60*10));

这是自过去某个固定时间以来的秒数。如果将其除以 600,则得到 10 分钟间隔的数量——聚合所需的数量。

【讨论】:

  • 完美!谢谢戈登。有趣的是,这也对齐了数据并处理了数据差距。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 2014-02-24
  • 2017-07-04
  • 2017-03-01
  • 2016-05-06
  • 1970-01-01
相关资源
最近更新 更多