【问题标题】:Calculate night length in r计算 r 中的夜间长度
【发布时间】:2020-04-21 07:23:48
【问题描述】:

一个正在寻求帮助的菜鸟。

我正在尝试计算 r 中设定日期的夜间长度,但我在这样做时遇到了麻烦。在上下文中,调查数据是在多个月的多个晚上的日落(-30 分钟)和日出(+30 分钟)之间获得的。我一直在寻找 lubridate 和 suncalc 软件包作为这样做的可能方式,但无法让它发挥作用。

日期、数据格式如下:

# A tibble: 6 x 4
  site  survey_ID survey_start survey_end
  <chr> <chr>     <chr>        <chr>     
1 LNR   T1        16/05/2019   26/05/2019
2 LNR   T2        16/05/2019   26/05/2019
3 LNR   T3        16/05/2019   19/05/2019
4 LNR   T4        16/05/2019   26/05/2019
5 LNR   T1        06/06/2019   17/06/2019
6 LNR   T2        06/06/2019   17/06/2019

目的是创建新列,其中包含指定日期之间的调查夜数、调查开始(日落前 30 分钟)和结束(日出后 30 分钟)的分钟数。然后,这将与另一个包含在这些时间段内特定时间记录的数据的 tibble/数据帧一起使用。

我也有网站的纬度和经度,以获得准确的夜间长度,因此理想情况下有使用经度和经度的代码。

提前谢谢大家。

【问题讨论】:

  • 欢迎来到 SO @russK。您能否向我们提供您希望生成的数据是什么样的?
  • 目前我只是想计算在survey_start和survey_end之间调查的每晚的分钟数。我位于英国北部,白天长度的季节变化可能非常极端,因此无法假设夜间长度。这将允许我计算每个survey_ID 位置的总工作量(时间),然后我将使用它来计算事件在夜间发生的次数(每小时/每晚)。我想这可能意味着将数据扩展为每晚都作为自己的行?
  • 那么对于survey_start,您想要sunset_time 还是sunrise_timesurvey_end 呢?
  • 还有你有多少个网站?
  • 我想我需要survey_start 的sunset_time 和survey_end 的sunset_time 都可以用来计算两者之间的时间。在此示例中,一个站点具有多个数据收集位置 (survey_ID)。

标签: r time dplyr lubridate tibble


【解决方案1】:

您必须根据日期、经度和纬度计算夜间长度。

我已经从维基百科的Sunrise Equation 中实现了以下功能。

getNightLength <- function(survey_date, latitude, longitude)
{
  survey_date <- strptime(survey_date, "%d/%m/%y")
  time_origin <- strptime("01/01/2000 12:00", "%d/%m/%Y %H:%M")
  n <- as.numeric(difftime(survey_date, time_origin, units = "days"))
  Jstar <- n - longitude / 360
  M <- (357.5291 + 0.98560028 * Jstar) %% 360
  C <- 1.9148 * sin(M * 2*pi/360) + 
       0.0200 * sin(2*M * 2*pi/360) + 
       0.0003 * sin(3*M * 2*pi/360)
  lambda <- (M + C + 180 + 102.9372) %% 360
  Jtransit <- as.double(2451545.000) + 
              as.double(Jstar) + 
              as.double(0.0053 * sin(M * 2*pi/360)) - 
              as.double(0.0069 * sin(lambda * 4*pi/360))
  sindelta <- sin(lambda * 2*pi/360) * sin(23.44 * 2*pi/360)
  delta <- asin(sindelta) * 360/(2*pi)
  cos_omega <- (sin(-0.83 * 2*pi/360) - (sindelta * sin(latitude * 2*pi/360)))/
                (cos(latitude * 2*pi/360) * cos(delta * 2*pi/360))
  omega <- acos(cos_omega) * 360 / (2*pi)
  Jrise <- Jtransit - omega / 360
  Jset <- Jtransit + omega /360
  return((1 - (Jset - Jrise)) * 24)
}

现在你可以像这样找出夜晚的长度:

getNightLength("21/05/2019", 55.6, -4.05)
#> [1] 7.427116

这告诉你晚上有多少小时。

【讨论】:

  • 太棒了,谢谢。我印象深刻。是否可以运行 getnightLength 函数来运行一系列日期,然后使用 mutate 将日期合并到数据中的新列中?比如,从第一次调查的日期 (16/05/2019) 到最后一次调查的日期 (12/09/2019)?
  • @russK 是的,它适用于向量,所以你应该能够将它与 mutate 一起使用。
  • 好的,谢谢。我会试一试,看看我能做些什么。
猜你喜欢
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多