Tenho um dataframe de locais e datas nos EUA para o qual quero recuperar o horário do pôr do sol. Usei tz_lookup_coords
o pacote lutz para definir o fuso horário com base na localização, mas quando insiro isso no bioRad, sunrise
recebo uma mensagem de erro informando que o valor tz é inválido.
# create dataframe
data <- data.frame(id = 1:10,
date = c("2018-02-05", "2018-12-29", "2018-05-25", "2018-02-19",
"2017-02-09", "2017-10-05", "2018-02-18",
"2017-11-27", "2017-10-13", "2018-12-03"),
wgs_x = c(-105.12782, -73.70111, -119.89776, -157.94036,
-85.62744, -87.73867, -90.03440 , -97.39539,
-112.34498, -83.06242),
wgs_y = c(39.98948, 41.03264, 36.84011, 21.33720, 42.88368,
30.42648, 35.20090, 27.68490, 34.62111, 42.39886))
data$date <- as.Date(data$date)
# define timezones
data$timezone <- tz_lookup_coords(data$wgs_y, data$wgs_x, method = "accurate", warn = F)
# define sunrise time
data$sunrise <- sunrise(date = data$date,
lon = data$wgs_x,
lat = data$wgs_y,
tz = data$timezone)
Sem saber o que você está vendo, tentarei reproduzir com base no que está sendo feito internamente
bioRad::sunrise
... ou seja,as.POSIXct(date, tz)
.Até agora tudo bem. No entanto, com base em https://github.com/adokter/bioRad/blob/master/R/sunrise_sunset.R#L129 , vou tentar
(Para perguntas futuras, geralmente é muito esclarecedor incluir a mensagem de erro real. Nesse caso, ela teria apontado muito mais rápido para uma chamada para funções R base, como
as.POSIXct
oustrptime
, e não teria que se esforçar muito para encontrar outras causas possíveis.)O que não está bem documentado em
?as.POSIXct
é que
tz=
deve ter comprimento 1. Isso ocorre porque um vetor dePOSIXt
valores em R deve ter o mesmo fuso horário. Ou seja, não é possível ter dois timestamps em um vetor com fusos horários diferentes; o"tzone"
atributo é aplicado ao vetor como um todo. (Uma coluna de um quadro é apenas um vetor.)Para ajudar a provar este ponto,
Porém, dependendo dos seus dados, isso pode alterar alguns valores de tempo.
Outra abordagem seria converter cada um de acordo com seus fusos horários específicos e, em seguida, combiná-los. Uma primeira tentativa poderia usar
mapply
, mas isso tende a remover a classe:Podemos consertar isso usando
Map
edo.call(c, ..)
:Observe que o R tende a considerar datas como UTC, e a conversão para carimbos de data/hora baseados em fuso horário produz horários diferentes. Como, como mencionei anteriormente, todos os valores POSIXt em um vetor devem compartilhar o mesmo fuso horário, todos eles são convertidos para o horário do primeiro fuso horário, embora você possa ver claramente que o horário é diferente para cada um.
Dito isso... todos eles apontam para a mesma data UTC convertida em um horário. Se você converter cada um desses carimbos de data/hora de MDT para o fuso horário retornado por
tz_lookup_coords
, eles retornarão à meia-noite: