Рассчитайте продолжительность ночи в r

Новичок ищет помощи.

Я пытаюсь рассчитать продолжительность ночи для установленной даты в 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 минут после восхода солнца). Затем он будет использоваться вместе с другим тибблом / фреймом данных, который содержит данные, записанные в определенное время в течение этих периодов.

У меня есть широта и долгота для сайта, чтобы получить точную продолжительность ночи, поэтому в идеале я должен иметь код, который использует широту и долготу.

Заранее всем спасибо.


person russK    schedule 02.01.2020    source источник
comment
Добро пожаловать в SO @russK. Не могли бы вы сообщить нам, как должны выглядеть полученные данные?   -  person akash87    schedule 02.01.2020
comment
На данный момент я просто пытаюсь подсчитать количество минут для каждой ночи, в течение которой проводился опрос между Survey_start и Survey_end. Я живу на севере Великобритании, и сезонные изменения в продолжительности дня могут быть весьма резкими, поэтому о длине ночи невозможно предположить. Это позволило бы мне рассчитать общие усилия (время) для каждого местоположения Survey_ID, которое я затем буду использовать для расчета количества раз, когда событие произошло в течение ночи (в час / за ночь). Я предполагаю, что это может означать расширение данных, чтобы каждая ночь была отдельной строкой?   -  person russK    schedule 02.01.2020
comment
Итак, для survey_start вы хотите sunset_time или sunrise_time? как насчет survey_end?   -  person akash87    schedule 02.01.2020
comment
Также сколько у вас сайтов?   -  person akash87    schedule 02.01.2020
comment
Я предполагаю, что мне понадобятся и sunset_time для survey_start, и sunrise_time для survey_end, которые затем можно использовать для расчета времени между ними. В этом примере есть один сайт с несколькими местами сбора данных (Survey_ID).   -  person russK    schedule 02.01.2020


Ответы (1)


Вам нужно будет рассчитать продолжительность ночи на основе даты, долготы и широты.

Я реализовал следующую функцию из уравнения восхода солнца Википедии.

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

Это говорит вам, сколько часов была ночь.

person Allan Cameron    schedule 02.01.2020
comment
Отлично, спасибо. Я очень впечатлен. Можно ли запустить функцию getnightLength для серии дат, а затем использовать mutate для объединения дат в новый столбец данных? Скажите, с даты первого опроса (16.05.2019) до даты последнего опроса (12.09.2019)? - person russK; 03.01.2020
comment
@russK Да, он работает с векторами, поэтому вы сможете использовать его с mutate. - person Allan Cameron; 03.01.2020
comment
Хорошо, спасибо. Я попробую и посмотрю, что я могу сделать. - person russK; 03.01.2020