R语言 筛选日落和日出之间的日期时间列[已关闭]

ckocjqey  于 2023-09-27  发布在  其他
关注(0)|答案(2)|浏览(100)

已关闭此问题为not reproducible or was caused by typos。它目前不接受回答。

此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这一个是解决的方式不太可能帮助未来的读者。
6天前关闭
Improve this question
我有一个数据集,看起来像这样

# A tibble: 24 × 3
   datetime            sunrise             sunset             
   <dttm>              <dttm>              <dttm>             
 1 2021-09-01 00:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
 2 2021-09-01 01:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
 3 2021-09-01 02:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
 4 2021-09-01 03:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
 5 2021-09-01 04:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
 6 2021-09-01 05:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
 7 2021-09-01 06:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
 8 2021-09-01 07:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
 9 2021-09-01 08:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
10 2021-09-01 09:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
df <- tibble(
  datetime = seq(as.POSIXct("2021-09-01 00:00:00"), as.POSIXct("2021-09-01 23:59:59"), by = "1 hour"),
  sunrise = as.POSIXct("2021-09-01 07:42:27"),
  sunset = as.POSIXct("2021-09-01 20:38:56")
)

我想在日落和日出之间过滤它,所以我有日期时间从00:00到07:00和21:00到24:00的行
我试过:
filter(sunset <= datetime | datetime <= sunrise)
没有任何运气

2ul0zpep

2ul0zpep1#

这个filter保留了datetime不落在sunrisesunset之间的区间内的行。

library(dplyr)
library(lubridate)

df %>%
  filter(!(datetime %within% interval(sunrise, sunset)))
#> # A tibble: 11 × 3
#>    datetime            sunrise             sunset             
#>    <dttm>              <dttm>              <dttm>             
#>  1 2021-09-01 00:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
#>  2 2021-09-01 01:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
#>  3 2021-09-01 02:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
#>  4 2021-09-01 03:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
#>  5 2021-09-01 04:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
#>  6 2021-09-01 05:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
#>  7 2021-09-01 06:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
#>  8 2021-09-01 07:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
#>  9 2021-09-01 21:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
#> 10 2021-09-01 22:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
#> 11 2021-09-01 23:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56

创建于2023-09-20使用reprex v2.0.2

iyfamqjs

iyfamqjs2#

library(dplyr)

df |> filter(!between(datetime, sunrise, sunset))

正如在评论中提到的,这相当于你已经发布了应该工作:

all.equal(df |> filter(datetime <= sunrise | datetime >= sunset), 
          df |> filter(!between(datetime, sunrise, sunset)))
[1] TRUE

另一种方法是,如果由于某种原因sunrisesunset不能作为边界,您可以像这样修复条件:

library(dplyr)
library(lubridate)

df |>
  filter(hour(datetime) <= 7 | hour(datetime) >= 21)

如果没有lubridate包:

df |>
  mutate(hr = as.numeric(format(datetime, format = "%H"))) |>
  filter(hr <= 7 | hr >= 21)

输出

datetime            sunrise             sunset             
   <dttm>              <dttm>              <dttm>             
 1 2021-09-01 00:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
 2 2021-09-01 01:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
 3 2021-09-01 02:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
 4 2021-09-01 03:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
 5 2021-09-01 04:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
 6 2021-09-01 05:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
 7 2021-09-01 06:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
 8 2021-09-01 07:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
 9 2021-09-01 21:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
10 2021-09-01 22:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56
11 2021-09-01 23:00:00 2021-09-01 07:42:27 2021-09-01 20:38:56

相关问题