从Postgres DB中对dplyr中的时间序列数据进行下采样

时间:2014-12-10 08:58:44

标签: r postgresql dplyr psql

我正在尝试使用dplyr来查询psql中的数据。我的数据采用以下格式。

date                  name    value
10-12-2012 10:01:00   var1    100
10-12-2012 10:55:00   var1    200
10-12-2012 11:01:00   var1    150
10-12-2012 11:50:00   var1    100
10-12-2012 12:11:00   var1    50
10-12-2012 12:40:00   var1    150
10-12-2012 10:01:00   var2    10
10-12-2012 10:33:00   var2    20
10-12-2012 11:04:00   var2    15
10-12-2012 11:45:00   var2    25
10-12-2012 12:02:00   var2    10
10-12-2012 12:55:00   var2    8

我想将数据汇总到每小时(或预定义的采样时间),并希望得到"值的平均值"那小时内的专栏。

必填项:

date                  name    value
10-12-2012 10:00:00   var1    150
10-12-2012 11:00:00   var1    125
10-12-2012 12:00:00   var1    100
10-12-2012 10:00:00   var2    15
10-12-2012 11:00:00   var2    20
10-12-2012 12:00:00   var2    9

我可以直接使用此查询在postgres中执行此操作:

"SELECT date_trunc('hour', date), name, mean_arr(array_agg(cast(value as double precision))) FROM TABLENAME WHERE name IN ("var1","var2")

我想知道,如果我们可以使用dplyr做同样的事情。

我目前在dplyr中使用此命令连接到数据库:

my_db <- rc_postgres(dbname="DBNAME",host="HOST",port="PORT",user="USER",password="PASSWD")
tbl_df <- tbl(my_db, "TABLENAME")

原始查询如下:

dataOut <- data.frame(tbl_df%>% select(date,name,value) %>% filter(name %in% c('var1','var2') 

请注意,我还没有汇总当前的数据,我想这样做。

如果有人回答,请告诉我。 谢谢 普拉迪普

1 个答案:

答案 0 :(得分:5)

这不会直接与您的SQL表一起工作。但这就是我要做的事情:

library(tidyr)
library(dplyr)

df <- tbl_df %>%
  separate(date, into = c("date", "time"), sep = " ") %>%
  separate(time, into = c("hour", "minute", "seccond"), sep = ":") %>%
  group_by(date, hour, name) %>%
  summarise(mean(value)) %>%
  ungroup() %>%
  arrange(name) %>%
  collect()

#> df
#Source: local data frame [6 x 4]
#
#        date hour name mean(value)
#1 10-12-2012   10 var1         150
#2 10-12-2012   11 var1         125
#3 10-12-2012   12 var1         100
#4 10-12-2012   10 var2          15
#5 10-12-2012   11 var2          20
#6 10-12-2012   12 var2           9