r - 使用 dplyr 以可变时间间隔过滤

标签 r datetime dplyr

我想根据可变时间间隔过滤我的时间序列。更具体地说,考虑来自时间戳 t 的时间 t_i。我想过滤我的时间序列,这样剩下的就是一个时间序列,只包含从 t_i - 15 分钟到并包括 t_i + 15 分钟的时间戳。
这是我尝试过的:

library(lubridate)
library(dplyr)

mv <- 2 # moving window
t <- as.POSIXct("2020-06-20 12:00", tz="UTC") # time stamp
time <- seq(ymd_hm('2020-01-01 00:00'),ymd_hm('2020-12-31 23:45'), by = '15 mins')
ts <- tibble(time=time, data=sin(seq(1,length(time),1)))

# What I did:
ts %>%
  filter(time >= t - mv*24*60*60) %>%
  filter(time <= t) %>%
  filter(strftime(time, format = "%H:%M", tz = "UTC") >= strftime(t-15*60, format = "%H:%M", tz = "UTC")) %>%
  filter(strftime(time, format = "%H:%M", tz = "UTC") <= strftime(t+15*60, format = "%H:%M", tz = "UTC"))

Output:

# A tibble: 7 x 2
  time                   data
  <dttm>                <dbl>
1 2020-06-18 12:00:00 -0.435 
2 2020-06-18 12:15:00  0.523 
3 2020-06-19 11:45:00  0.298 
4 2020-06-19 12:00:00  0.964 
5 2020-06-19 12:15:00  0.744 
6 2020-06-20 11:45:00  0.885 
7 2020-06-20 12:00:00  0.0870
这正是我想要的,但它在 t <- as.POSIXct("2020-06-20 23:45", tz="UTC") 时崩溃了(还有 00:00 ):
# A tibble: 0 x 2
# … with 2 variables: time <dttm>, data <dbl>
我包含了一个 if-else 语句来规避这一点,但它远非优雅,也没有给我我想要的东西:
t <- as.POSIXct("2020-06-20 23:45", tz="UTC") # time stamp
if(strftime(t, format = "%H:%M", tz = "UTC") %in% c("23:45","00:00")){
  ts %>% 
    filter(time >= t - mv*24*60*60) %>%
    filter(time <= t) %>%
    filter(strftime(time, format = "%H:%M", tz = "UTC") >= strftime(t-15*60, format = "%H:%M", tz = "UTC"))
} else {
  ts %>% 
    filter(time >= t - mv*24*60*60) %>%
    filter(time <= t) %>%
    filter(strftime(time, format = "%H:%M", tz = "UTC") >= strftime(t-15*60, format = "%H:%M", tz = "UTC")) %>%
    filter(strftime(time, format = "%H:%M", tz = "UTC") <= strftime(t+15*60, format = "%H:%M", tz = "UTC"))
}

Output:
# A tibble: 5 x 2
  time                  data
  <dttm>               <dbl>
1 2020-06-18 23:45:00  0.543
2 2020-06-19 23:30:00 -0.177
3 2020-06-19 23:45:00 -0.924
4 2020-06-20 23:30:00 -0.936
5 2020-06-20 23:45:00 -0.209

Desired output:
# A tibble: 7 x 2
  time                  data
  <dttm>               <dbl>
1 2020-06-18 23:45:00  0.543
2 2020-06-19 00:00:00 -0.413
3 2020-06-19 23:30:00 -0.177
4 2020-06-19 23:45:00 -0.924
5 2020-06-20 00:00:00 -0.821
6 2020-06-20 23:30:00 -0.936
7 2020-06-20 23:45:00 -0.209
几天之间的转换似乎存在问题,但我不知道如何解决,也找不到类似的问题。有没有办法(优雅地)实现这一目标?

最佳答案

看来strftime(ts$time[1], format = "%H:%M", tz = "UTC") > strftime(t, format = "%H:%M", tz = "UTC")评估为 FALSE这取决于你如何看待它。
为了缓解这种情况,您需要完整的 YYYY-MM-DD HH:MM以便“正确”评估它。如果您评估完整的字符串,而不仅仅是 hours,就会出现这种情况。 .
我们可以得到intervals通过添加 dummy -变量我们称之为time_包括所有 HH:MM ,然后将它们视为 strings ,

# Troublesome Vector;
t <- ymd_hm("2020-06-20 23:45", tz="UTC")




ts %>% filter(
        between(
                time, 
                left = t - mv*24*60*60 -15*60,
                right = t
        )
) %>% mutate(
        time_ = strftime(time, format = "%H:%M", tz = "UTC") %>% as.character()
) %>% filter(
        str_detect(
                time_,
                pattern = seq(
                        t-15*60,
                        t+15*60,
                        by = "15 mins"
                ) %>% strftime(format = "%H:%M", tz = "UTC") %>% paste(
                        collapse = "|"
                )
        )
)
这给出了 output ,
# A tibble: 8 x 3
  time                  data time_
  <dttm>               <dbl> <chr>
1 2020-06-18 23:30:00  1.00  23:30
2 2020-06-18 23:45:00  0.543 23:45
3 2020-06-19 00:00:00 -0.413 00:00
4 2020-06-19 23:30:00 -0.177 23:30
5 2020-06-19 23:45:00 -0.924 23:45
6 2020-06-20 00:00:00 -0.821 00:00
7 2020-06-20 23:30:00 -0.936 23:30
8 2020-06-20 23:45:00 -0.209 23:45

关于r - 使用 dplyr 以可变时间间隔过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68541685/

相关文章:

c# - 在 .net 核心中设置全局时区

java - 奇怪的日期字符串格式

r - 如何过滤掉特定列全部为na的位置

r - 用于创建多个数据框和赋值的 for 循环

r - 如何将值列表分配给 R 中的 HashMap ?

r - 错误栏和值标签没有放置在 ggplot2 中的正确栏上

javascript - 当仅绘制某些观察值时,框选择时返回不正确的行索引 - Plotly、htmlWidgets、Shiny

r - 将个体基因组间隔连接到种群区域

r - 使用R中的dplyr按月创建季节变量

javascript - 代码似乎正在分配,而它应该只是读取值