You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R语言bioRad包中使用sunrise函数时时区定义报错

解决bioRad::sunrise函数时区无效的问题

问题出在bioRad::sunrise函数的tz参数不支持传入向量,它要求单个时区字符串,但你用tz_lookup_coords得到的是每行对应的时区向量,直接传入就会触发"时区值无效"的错误。

要解决这个问题,需要逐行处理数据,把每行对应的日期、经纬度和时区单独传入sunrise函数。这里推荐两种实现方式:

方法一:用purrr包的向量化工具

# 加载所需包
library(lutz)
library(bioRad)
library(purrr)

# 创建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)

# 定义时区
data$timezone <- tz_lookup_coords(data$wgs_y, data$wgs_x, method = "accurate", warn = F)

# 逐行计算日出时间
data$sunrise <- pmap(data[c("date", "wgs_x", "wgs_y", "timezone")], 
                     function(date, wgs_x, wgs_y, timezone) {
                       sunrise(date = date, lon = wgs_x, lat = wgs_y, tz = timezone)
                     })

# 可选:将列表结果转为统一的POSIXct格式
data$sunrise <- do.call(c, data$sunrise)

方法二:用基础R的apply函数

# 加载所需包
library(lutz)
library(bioRad)

# 创建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)

# 定义时区
data$timezone <- tz_lookup_coords(data$wgs_y, data$wgs_x, method = "accurate", warn = F)

# 逐行计算日出时间
data$sunrise <- apply(data, 1, function(row) {
  sunrise(date = as.Date(row["date"]),
          lon = as.numeric(row["wgs_x"]),
          lat = as.numeric(row["wgs_y"]),
          tz = row["timezone"])
})

两种方法都能确保每行对应的时区被正确传入sunrise函数,避免时区无效的错误。

内容的提问来源于stack exchange,提问作者Nicole

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 09:37:33