Временная метка solaR для излучения на наклонной поверхности
Я пытаюсь использовать пакет R SolaR для расчета освещенности на наклонной плоскости с учетом измеренной освещенности на горизонтальной плоскости. Я могу заставить код работать, но конечная метка времени не имеет смысла.
Данные для этого кода можно найти здесь. Это измеренное значение освещенности за один день (глобальная горизонталь - ГГц, прямая норма - дир, рассеянная горизонталь - Гц и температура наружного воздуха) для Остина, Техас. Временная метка - это местное время CST6CDT. Данные относятся к ясному дню, поэтому максимальное значение глобальной горизонтали (ГГц) должно приблизительно соответствовать солнечному полудню (времени, когда Солнце пересекает местный меридиан).
Мой код выглядит следующим образом:
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)
Когда я использую бета = 0, альфа = 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...
Я знаю, это неясно, но есть мысли?
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'))
Функция local2Solar
преобразует часовой пояс POSIXct
возражать против среднего солнечного времени и установить его часовой пояс в 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
Возможно, эти технические примечания полезны для дополнительной информации по этой теме:
- Рипли, Б.Д. и Хорник, К. (2001). Уроки даты и времени. R News, 1/2, 8–11.
- Габор Гротендик и Томас Петцольдт (2004), классы даты и времени в R, R News 4 (1), 29-32.
Кроме того, вы должны взглянуть на информацию и примеры help(timezone)
,
Большое спасибо за прямой ответ и за отличный пакет. Оказывается, у нас была совершенно неправильная интерпретация солнечного времени. Я вижу другую возможную проблему, которая не вписывается в раздел комментариев.
Когда я бегу:
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""
это солнечный полдень для этого дня.
Я управлял уравнениями Г. Мастера отдельно от solaR
и получил: "2013-06-07 13:29:30 CDT"
(максимальная точность - каждая минута для этой версии) для времени с максимальной падающей мощностью для первого случая на "2013-06-07"
,