คำนวณความยาวกลางคืนเป็น 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 นาทีหลังพระอาทิตย์ขึ้น) จากนั้นจะใช้ควบคู่ไปกับ tibble/data frame อื่นที่มีข้อมูลที่บันทึกในเวลาที่กำหนดภายในช่วงเวลาเหล่านี้

ฉันมี lat และ long สำหรับไซต์เช่นกันเพื่อให้ได้ความยาวกลางคืนที่แน่นอน ดังนั้นควรมีโค้ดที่ใช้ lat และ long

ขอขอบคุณทุกท่านล่วงหน้าครับ.


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)


คุณจะต้องคำนวณระยะเวลากลางคืนตามวันที่ ลองจิจูด และละติจูด

ฉันได้ใช้ฟังก์ชันต่อไปนี้จาก สมการพระอาทิตย์ขึ้น ของ 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)
}

ตอนนี้คุณสามารถทราบระยะเวลากลางคืนได้ดังนี้:

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

สิ่งนี้จะบอกคุณว่าคืนนี้กี่ชั่วโมง

person Allan Cameron    schedule 02.01.2020
comment
น่าทึ่งมาก ขอบคุณ ฉันประทับใจมาก เป็นไปได้ไหมที่จะเรียกใช้ฟังก์ชัน getnightLength เพื่อเรียกใช้ชุดวันที่แล้วใช้การกลายพันธุ์เพื่อรวมวันที่ลงในคอลัมน์ใหม่ในข้อมูล สมมติว่าตั้งแต่วันที่สำรวจครั้งแรก (16/05/2019) ถึงวันที่สำรวจครั้งล่าสุด (12/09/2019)? - person russK; 03.01.2020
comment
@russK ใช่มันใช้งานได้กับเวกเตอร์ ดังนั้นคุณควรใช้กับการกลายพันธุ์ได้ - person Allan Cameron; 03.01.2020
comment
โอเคขอบคุณ. ฉันจะลองดูว่าฉันจะทำอะไรได้บ้าง - person russK; 03.01.2020