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

如何为多地点多日期的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:16:02