Hitung panjang malam di r

Seorang pemula sedang mencari bantuan.

Saya mencoba menghitung lama malam untuk tanggal tertentu di r, tetapi saya kesulitan melakukannya. Singkatnya, data survei diperoleh antara matahari terbenam (-30 menit) dan matahari terbit (+30 menit) selama beberapa malam selama beberapa bulan. Saya telah mencari paket pelumas dan suncalc sebagai cara yang mungkin untuk melakukannya tetapi tidak dapat membuatnya berfungsi.

Tanggal, data dalam format di bawah ini:

# 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

Tujuannya adalah untuk membuat kolom baru dengan jumlah malam survei antara tanggal yang ditentukan, jumlah menit dari awal survei (30 menit sebelum matahari terbenam) dan berakhir (30 menit setelah matahari terbit). Ini kemudian akan digunakan bersama tibble/bingkai data lain yang berisi data yang direkam pada waktu tertentu dalam periode tersebut.

Saya juga memiliki lintang dan bujur untuk situs tersebut untuk mendapatkan panjang malam yang tepat sehingga idealnya memiliki kode yang menggunakan lintang dan bujur.

Terima kasih sebelumnya semuanya.


person russK    schedule 02.01.2020    source sumber
comment
Selamat datang di SO @russK. Bisakah Anda memberi tahu kami tampilan data yang Anda inginkan?   -  person akash87    schedule 02.01.2020
comment
Saat ini saya hanya ingin menghitung jumlah menit untuk setiap malam yang disurvei antara survey_start dan survey_end. Saya berbasis di Inggris bagian utara dan perubahan musim pada panjang siang hari bisa sangat ekstrem sehingga lamanya malam tidak dapat diasumsikan. Ini akan memungkinkan saya menghitung total upaya (waktu) untuk setiap lokasi survey_ID yang kemudian akan saya gunakan untuk menghitung berapa kali peristiwa tersebut terjadi pada malam hari (per jam/per malam). Saya kira itu mungkin berarti memperluas data agar setiap malam menjadi barisnya sendiri?   -  person russK    schedule 02.01.2020
comment
Jadi untuk survey_start kamu mau yang sunset_time atau sunrise_time? bagaimana dengan survey_end?   -  person akash87    schedule 02.01.2020
comment
Juga berapa banyak situs yang Anda miliki?   -  person akash87    schedule 02.01.2020
comment
Saya kira saya memerlukan waktu_matahari terbenam untuk awal_survei dan waktu_matahari terbit untuk akhir_survei yang kemudian dapat digunakan untuk menghitung waktu di antara keduanya. Dalam contoh ini ada satu situs dengan beberapa lokasi pengumpulan data (survey_ID).   -  person russK    schedule 02.01.2020


Jawaban (1)


Anda harus menghitung lamanya malam berdasarkan tanggal, bujur dan lintang.

Saya telah mengimplementasikan fungsi berikut dari Sunrise Equation Wikipedia.

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)
}

Sekarang Anda bisa mengetahui lamanya malam seperti ini:

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

Ini memberitahu Anda berapa jam malam itu.

person Allan Cameron    schedule 02.01.2020
comment
Luar biasa, terima kasih. Saya sangat terkesan. Apakah mungkin menjalankan fungsi getnightLength untuk menjalankan serangkaian tanggal dan kemudian menggunakan mutate untuk menggabungkan tanggal ke dalam kolom baru di data? Katakanlah, dari tanggal survei pertama (16/05/2019) hingga tanggal survei terakhir (12/09/2019)? - person russK; 03.01.2020
comment
@russK Ya, ini berfungsi pada vektor, jadi Anda seharusnya bisa menggunakannya dengan mutate. - person Allan Cameron; 03.01.2020
comment
Oke terima kasih. Saya akan mencobanya dan melihat apa yang bisa saya lakukan. - person russK; 03.01.2020