时间步长从0.1秒到半小时(30分钟),UTC小时

时间:2017-02-21 18:03:47

标签: r data.table xts

我的数据间隔为0.1秒或10行,持续1秒 所以864000行为一天,基于24 * 60 * 60 * 10。

我希望通过将其从0.1秒时间步长聚合到半小时来找到我的数据中的列的平均值(风速和此处未显示的其他变量)。因此,数据将从864000行汇总到48行(一天)

输入:

           tms  Hr  Min Sec Wind speed
7/13/2014 0:00  0   0   0   3.45
7/13/2014 0:00  0   0   0.1 52.34
7/13/2014 0:00  0   0   0.2 1.23
7/13/2014 0:00  0   0   0.3 4.3
7/13/2014 0:00  0   0   0.4 1.34
7/13/2014 0:00  0   0   0.5 3.6

输出我想看:

Year    Month   Day Hr  Wind speed
7/13/2014   7   13  0   21.92
7/13/2014   7   13  0.5 29.38
7/13/2014   7   13  1   24.18
7/13/2014   7   13  1.5 1.70
7/13/2014   7   13  2   1.80

我的小时平均值代码,我希望将数据汇总半小时(不是一小时)。 dat是没有tms列的数据的位置:所以我添加了一个日期列。

library(data.table)
library(xts)
dat <- data.table(dat)
tms <- as.POSIXct(seq(0,24*(60*60*10)-1,by=1),origin="2014-07-13",tz="UTC")
xts.ts <- data.frame(xts(dat,tms))

现在我已将tms列添加到我的数据

Aut <- data.frame(tms,xts.ts, check.names=FALSE, row.names=NULL) 
mean2 <- aggregate(Aut, 
                   list(hour=cut(as.POSIXct(Aut$tms), "hour")),
                   mean)

但即使每小时都不正确。我希望我的数据意味着半小时。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,您可以使用xts::period.apply

轻松完成此操作
library(xts)
options(digits.secs = 1)  # display fractional seconds
# create 1 day of timestamps that are 0.1 seconds apart
tms <- as.POSIXct(seq(0, 86400-1, by=0.1), origin="2014-07-13", tz="UTC")
# create an xts object with some random data and the times created above
set.seed(21)
xts.ts <- xts(runif(length(tms), 0, 50), tms)
# use period.apply and endpoints to calculate the 30-minute means
mean30min <- period.apply(xts.ts, endpoints(xts.ts, "mins", 30), mean)
# round up to next 30-minute period
mean30min <- align.time(mean30min, 60*30)

如果您希望结果是data.table或data.frame并添加了其他列,则可以在聚合后轻松完成。

library(data.table)
dt.mean30 <- as.data.table(mean30min)
dt.mean30[, Month := .indexmon(mean30min) + 1]
dt.mean30[, Day := .indexmday(mean30min)]
dt.mean30[, Hr := .indexhour(mean30min) + .indexmin(mean30min)/60]