我想将白天/晚上/黄昏/黎明分配给遥测数据的检测时间,并遵循stackoverflow上对此问题提出的解决方案:为R 中的跟踪数据添加白天/黄昏/晚上/黎明的信息
这是我的df,t_是我的日期/时间列(=检测时间(,我想将白天/晚上/黄昏/黎明分配给:
str(data)
'data.frame': 843 obs. of 8 variables:
$ date : Date, format: "2021-08-08" "2021-08-08" ...
$ lat : int 66 66 66 66 66 66 66 66 66 66 ...
$ lon : int -23 -23 -23 -23 -23 -23 -23 -23 -23 -23 ...
$ id : int 56985 56985 56985 56985 56985 56985 56985 56985 56985 56985 ...
$ t_ : POSIXct, format: "2021-08-08 01:00:00" "2021-08-08 23:00:00" ...
$ Receiver.ID : int 302371 302371 302371 302372 302372 302372 302377 302372 302372 302376 ...
$ Position.in.fjord: chr "T1R1" "T1R1" "T1R1" "T1R3" ...
$ row_num : int 1 2 3 4 5 6 7 8 9 10 ...
我用getSunlightTimes
(suncalc(学习的每一天都有日出、日落、夜晚和夜晚的时间。
因为这项研究部分是在66°N的夏夜(24小时日光(进行的;夜晚;或";nightEnd";在9月7日之前提供
str(sun)
'data.frame': 843 obs. of 8 variables:
$ date : Date, format: "2021-08-08" "2021-08-08" ...
$ lat : int 66 66 66 66 66 66 66 66 66 66 ...
$ lon : int -23 -23 -23 -23 -23 -23 -23 -23 -23 -23 ...
$ sunrise : POSIXct, format: "2021-08-08 04:46:07" "2021-08-08 04:46:07" ...
$ sunset : POSIXct, format: "2021-08-08 22:31:48" "2021-08-08 22:31:48" ...
$ night : POSIXct, format: NA NA ...
$ nightEnd: POSIXct, format: NA NA ..
$ row_num : int 1 2 3 4 5 6 7 8 9 10 ...
创建一个新的df,列中包含白天/夜晚/黄昏/黎明:
daynight <-data %>%
full_join(sun, by="row_num") %>%
mutate(period= case_when(t_ %within% interval(sunset, night) ~ 'dusk',
t_ %within% interval(night, nightEnd) ~ 'night',
t_ %within% interval(nightEnd, sunrise) ~ 'dawn',
t_ %within% interval(sunrise, sunset) ~ 'day'))
白天、黄昏和黎明大多被正确地分配给来自检测的日期/时间数据。错误发生在间隔之间的转换附近,即当检测时间(t_(在下一个间隔(日出、日落等(开始的时间的一小时内时。例如,t_是一种检测:
t_ / sunrise / sunset / period
2021-09-14 07:00:00 / 2021-09-14 06:50:36 / 2021-09-14 20:07:21 / dawn
"黎明";应该是";天";。
如何将白天/夜晚/黄昏/黎明100%正确分配给我的数据?
嗨,您可以使用确保所有时区设置相同
data %>%
mutate(across(where(is.POSIXct), ~lubridate::`tz<-`(.,value = "UTC"))
你当然可以使用任何你喜欢的时区