【发布时间】:2017-02-22 11:59:34
【问题描述】:
我有以下数据框:
time <- c("2004-01-01 01:30:00","2004-01-01 04:30:00","2004-01-01 07:30:00",
"2004-01-01 10:30:00","2004-01-01 13:30:00","2004-01-01 16:30:00",
"2004-01-01 19:30:00","2004-01-01 22:30:00","2004-01-02 01:30:00",
"2004-01-02 04:30:00","2004-01-02 07:30:00","2004-01-02 10:30:00",
"2004-01-02 13:30:00","2004-01-02 16:30:00","2004-01-02 19:30:00",
"2004-01-02 22:30:00","2004-01-03 01:30:00","2004-01-03 04:30:00",
"2004-01-03 07:30:00","2004-01-03 10:30:00")
d <- c(0.00, 0.00,152808.30, 739872.84, 82641.22, 83031.04, 83031.04, 82641.22, 0.00,
0.00, 267024.71,1247414.7, 151638.85, 151249.03, 151249.03, 152028.67, 0.00, 0.00,
296650.81,1355783.85)
dat <- data.frame(time = time, dat = d)
显示来自预测模型 3 天的太阳辐射累积(每天)。
要将太阳辐射的单位从 J/m2 转换为 W/m2,我需要计算每天不同预测时间之间的差异,然后除以 10800(预测时间)。这是我的尝试:
itime <- as.numeric(as.Date(dat$time))
utime <- unique(itime)
l <- list()
for(i in 1:length(utime)){
idx <- itime == utime[i]
dat2 <- dat[idx,]
dat3 <- dat2[1,2]/10800
for(ii in 2:nrow(dat2)){
dat3[ii] <- (abs(dat2[ii,2] - dat2[ii-1,2]))/10800
}
df <- data.frame(dateTime = dat2$time,
dd = dat3)
l[[i]] <- df
}
df1 <- do.call(rbind.data.frame, l)
df1[,1] <- as.POSIXct(df1[,1])
按预期执行。但是,我打算使用此代码的实际数据长度超过 100 天。因此,运行循环并不是最优的。
还有其他方法可以代替循环吗?
我试过了:
dat2 <- c(dat[1,2]/10800,rev(abs(diff(rev(dat[,2])))/10800))
df2 <- data.frame(time = as.POSIXct(dat[,1]), dd = dat2)
它给出了几乎相同的答案(与循环一样),但它还计算不同日期的时间步长之间的差异,而不是将计算隔离到各个日期。
plot(df1, type = 'l')
lines(df2, col = 'red')
如您所见,凌晨存在不匹配。
谁能推荐另一种方法?
【问题讨论】:
标签: r