如何为多地点多日期的R数据框添加日出日落时间列
为R数据框添加逐行对应日出日落时间列
针对你的需求,这里提供三种可行的方案,均基于suncalc包实现,适配1500行规模的数据:
方法1:向量直接传递(最简洁高效)
suncalc::getSunlightTimes本身支持接收与date等长的经纬度向量,无需逐行循环,直接批量处理:
# 加载所需包 library(suncalc) # 批量获取日出日落时间 sun_times <- getSunlightTimes( date = df1$date, lat = df1$latitude, lon = df1$longitude, keep = c("sunrise", "sunset"), tz = "America/St_Johns" ) # 合并到原数据框 df1_with_sun <- cbind(df1, sun_times[, c("sunrise", "sunset")])
说明:此方法效率最高,适合大规模数据,只要date、latitude、longitude三列长度完全匹配即可。
方法2:dplyr行处理(直观易读)
如果需要更清晰的行级逻辑展示,可使用dplyr的rowwise()按行执行:
# 加载所需包 library(dplyr) library(suncalc) # 按行计算并合并结果 df1_with_sun <- df1 %>% rowwise() %>% mutate( # 每行调用getSunlightTimes,结果存为列表 sun_data = list(getSunlightTimes( date = date, lat = latitude, lon = longitude, keep = c("sunrise", "sunset"), tz = "America/St_Johns" )), # 提取日出日落时间 sunrise = sun_data$sunrise, sunset = sun_data$sunset ) %>% ungroup() %>% select(-sun_data) # 移除临时中间列
说明:rowwise()会强制后续操作按行执行,适合需要在每行添加额外逻辑的场景。
方法3:purrr映射(灵活扩展)
使用purrr的pmap_dfr实现多参数映射,适合需要自定义处理逻辑的情况:
# 加载所需包 library(purrr) library(suncalc) # 定义单行处理函数 process_row <- function(date, lat, lon) { getSunlightTimes( date = date, lat = lat, lon = lon, keep = c("sunrise", "sunset"), tz = "America/St_Johns" ) %>% select(sunrise, sunset) } # 映射到每一行并合并结果 sun_times_df <- pmap_dfr(df1[, c("date", "latitude", "longitude")], process_row) # 合并到原数据框 df1_with_sun <- cbind(df1, sun_times_df)
说明:此方法可轻松扩展单行处理逻辑,比如添加异常值判断等。
运行任意一种方法后,df1_with_sun都会包含新增的sunrise和sunset列,类型为带时区信息的POSIXct格式。
内容的提问来源于stack exchange,提问作者Fiona
相关产品推荐
相关产品推荐

