为什么日出/日落/夜晚/夜晚之间的间隔没有正确分配白天/夜晚/黄昏/黎明END



我想将白天/晚上/黄昏/黎明分配给遥测数据的检测时间,并遵循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"))

你当然可以使用任何你喜欢的时区

最新更新