3

我正在尝试使用 R 包solaR来计算倾斜平面上的辐照度,给定水平面上的测量辐照度。我可以让代码工作,但最终的输出时间戳没有意义。

可以在此处找到此代码的数据。这是德克萨斯州奥斯汀一天测量的辐照度(全球水平 - ghz、直接法线 - dir、漫射水平 - dhz 和室外温度 ta)。时间戳是本地“CST6CDT”时间。数据是晴天,所以全球水平(ghz)的最大值应该与太阳正午(太阳穿过当地子午线的时间)大致对应。

我的代码如下:

library(solaR)

sol_data <- read.csv(file)

    # The data must be named a certain way.
names(sol_data) <- c('time', 'G0', 'B', 'D0', 'Ta')

    # The negatives are an artifact of the sensor and are set to 0.
sol_data$G0 <- ifelse(sol_data$G0 < 0, 0, sol_data$G0)
sol_data$B <- ifelse(sol_data$B < 0, 0, sol_data$B)
sol_data$D0 <- ifelse(sol_data$D0 < 0, 0, sol_data$D0)

# This calculates the beam incidence on the horizontal plane. 
sol_data$B0 <- sol_data$G0 - sol_data$D0
sol_data$B0 <- ifelse(sol_data$B0 < 0, 0, sol_data$B0)

    # This takes the data and assigns the timestamp to a certain format and timezone
idxLocal <- with(sol_data, as.POSIXct(time, format='%Y-%m-%d %H:%M:%S', tz = 'CST6CDT'))
    # This converts the timestamp to solar time
idx <- local2Solar(idxLocal, lon = -97.7428)

    # Creates a zoo object needed to make the Meteo file for input
z <- zoo(sol_data[,c('G0', 'D0', 'B0', 'Ta')], idx)

    # local latitude
lat = 30.2669

    # Creates a Meteo file
My_Meteo <- zoo2Meteo(z, lat=lat)


# Finds the start and end date of the input file
start <- idx[1] 
end <- idx[length(idx)] 

    # Returns a base time for the calculations
BTd <- fBTd(mode = 'serie', year = '2013', start = start, end = end, format = '%Y-%m-%d %H:%M:%S')
    # Computes the movement of the sun/earth
sol <- calcSol(lat = 30.2669, BTd, sample = 'min')

# Creates a G0 file for solar rad on horizontal surface
compI <- calcG0(30.2669, modeRad = 'bdI', dataRad = My_Meteo, corr = 'none')
    # creates the angles for calculation of the rad on a tilted surface
angGen <- fTheta(sol = sol, beta = 0, alfa = 0)
    # Calculates the irradiance on a tilted surface
irad_tilt <- fInclin(compI, angGen)

当我使用 beta = 0, alfa = 0(平面)时,我应该得到与我的输入大致相同的输出。但是,当我搜索全局水平辐照度的最大值时:

x <- which.max(irad_tilt$G) 
irad_tilt[x,]

我让它在 2013-05-05 10:43:01 返回最大值,我无法弄清楚这次是什么/为什么。不是当地时间,应该是13:24左右。当地太阳时应在 12:00 左右。UTC时间应该是18:24左右,UTC太阳时(如果有的话)应该是17:00...

我知道这很模糊,但有什么想法吗?

4

2 回答 2

2

我已经在我的计算机中测试了代码和数据,结果正确。让我们用一些图形输出重现主要步骤:

library(solaR)

sol_data <- read.csv('/tmp/one_day_WSL_8.csv')

## The data must be named a certain way.
names(sol_data) <- c('time', 'G0', 'B', 'D0', 'Ta')

## The negatives are an artifact of the sensor and are set to 0.
sol_data$G0 <- ifelse(sol_data$G0 < 0, 0, sol_data$G0)
sol_data$B <- ifelse(sol_data$B < 0, 0, sol_data$B)
sol_data$D0 <- ifelse(sol_data$D0 < 0, 0, sol_data$D0)

## This calculates the beam incidence on the horizontal plane.
sol_data$B0 <- sol_data$G0 - sol_data$D0
sol_data$B0 <- ifelse(sol_data$B0 < 0, 0, sol_data$B0)

## This takes the data and assigns the timestamp to a certain format and timezone
idxLocal <- with(sol_data, as.POSIXct(time, format='%Y-%m-%d %H:%M:%S', tz = 'CST6CDT'))

该函数local2SolarPOSIXct对象的时区转换为平均太阳时,并将其时区设置为 UTC 作为平均太阳时的同义词。它包括两个更正:位置和时区之间的经度差异,以及夏令时。

idx <- local2Solar(idxLocal, lon = -97.7428)

## Creates a zoo object needed to make the Meteo file for input
z <- zoo(sol_data[,c('G0', 'D0', 'B0', 'Ta')], idx)

由于您的数据属于晴天,并且此时间序列使用平均太阳时,因此最大值应位于中午左右。

xyplot(z, type=c('l', 'g'))

平均太阳时数据

现在我们用 计算太阳几何calcSol。在这里,我使用的代码与您的不同。

## local latitude
lat = 30.2669
## Computes the movement of the sun/earth
sol <- calcSol(lat, BTi=idx)

xyplot(as.zooI(sol), type=c('l', 'g'))

太阳几何

接下来我们计算水平面上的辐射。

g0 <- calcG0(lat, modeRad = 'bdI', dataRad = z, corr = 'none')

xyplot(as.zooI(g0), type=c('l', 'g'))

水平辐照度

最后,calcGef我们获得倾斜表面上的辐照度:

gef <- calcGef(lat=lat, modeRad='bdI', dataRad=z)

xyplot(as.zooI(gef), type=c('l', 'g'))

倾斜平面上的辐照度

我怀疑您的问题与您计算机中定义的时区有关。你能检查这些结果吗?:

lonHH('America/Chicago')
## [1] -1.570796
lonHH('CDT6CST')
## [1] -1.570796

idxLocal1 <- as.POSIXct(sol_data$time, format='%Y-%m-%d %H:%M:%S', tz = 'CST6CDT')
idxLocal2 <- as.POSIXct(sol_data$time, format='%Y-%m-%d %H:%M:%S', tz = 'America/Chicago')

idxUTC1 <- as.POSIXct(format(idxLocal1, tz='UTC'), tz='UTC')
idxUTC2 <- as.POSIXct(format(idxLocal2, tz='UTC'), tz='UTC')

all.equal(idxUTC1, idxUTC2)
## [1] TRUE

也许这些技术说明对于有关此主题的其他信息很有用:

此外,您应该查看 的信息和示例help(timezone)

于 2013-06-20T12:28:05.183 回答
1

非常感谢您的直接回复和出色的包裹。事实证明,我们对太阳时的解释非常错误。我看到了一个不同的可能问题,不适合评论部分。

当我运行时:

local2Solar(as.POSIXct("2013-07-07 13:36:00",tz="America/Chicago"),lon=-97.7428)

我明白了"2013-07-07 12:05:01 UTC"。根据 NOAA的说法"2013-07-07 13:36:00",那天是太阳正午。

只是为了混淆问题,当我运行时:

local2Solar(as.POSIXct("2013-06-07 13:30:00",tz="America/Chicago"),lon=-97.7428)

我明白"2013-06-07 11:59:01 UTC"了,所以它似乎非常接近。根据 NOAA的说法"2013-06-07 13:30:00",那天是太阳正午。

如果您要运行:

local2Solar(as.POSIXct("2013-01-07 12:37:27",tz="America/Chicago"),lon=-97.7428)

你会得到"2013-01-07 12:06:28 UTC". 根据 NOAA的说法"2013-01-07 12:37:27"",那天是太阳正午。

我分别运行 G. Master 的方程solaR并得到:("2013-06-07 13:29:30 CDT"此版本的最高精度是每分钟)对于第一种情况下具有最大入射功率的时间"2013-06-07"

于 2013-06-20T16:52:45.917 回答