【问题标题】:In R, how can I automate the detection of where a non-standard time difference first occurs?在 R 中,如何自动检测首次出现非标准时差的位置?
【发布时间】:2020-05-20 18:11:44
【问题描述】:

我有一个数据框,其中每一行都是不同的时间戳。数据框中较旧的数据每隔 30 分钟收集一次,而较新的数据每隔 15 分钟收集一次。我想运行一个计算每行之间的时间差的 for 循环(或者可能是 ifelse 语句),如果差值等于 30 分钟(下面的示例使用 1800 秒),那么循环继续,但如果循环遇到15 分钟的时差(下面的示例使用 900 秒)它会停止并告诉我这首先发生在哪一行。

x <- as.POSIXct("2000-01-01 01:00", tz = "", "%Y-%m-%d %H:%M")
y <- as.POSIXct("2000-01-10 12:30", tz = "", "%Y-%m-%d %H:%M")
xx <- as.POSIXct("2000-01-10 12:45", tz = "", "%Y-%m-%d %H:%M")
yy <- as.POSIXct("2000-01-20 23:45", tz = "", "%Y-%m-%d %H:%M")

a.30 <- as.data.frame(seq(from = x, to = y, by = 1800))
names(a.30)[1] <- "TimeStamp"
a.15 <- as.data.frame(seq(from = xx, to = yy, by = 900))
names(a.15)[1] <- "TimeStamp"

dat <- rbind(a.30,a.15)

在示例 dat 数据帧中,时差在第 457 行从 30 分钟切换到 15 分钟。我想自动识别第一次出现这种时差变化的行。

【问题讨论】:

    标签: r datetime for-loop if-statement


    【解决方案1】:

    我们可以使用difftime计算mins中的时间差,并根据差创建一个逻辑向量

    library(dplyr)
    dat %>%
       summarise(ind = which.max(abs(as.numeric(difftime(TimeStamp, 
           lag(TimeStamp, default = TimeStamp[2]), unit = 'min'))) < 30))
    #  ind
    #1 457
    

    【讨论】:

      【解决方案2】:

      这是另一种使用稍有不同逻辑的方法。计算差异,并使用行号创建一列。然后过滤到差为15的地方,取第一行。

      library(tidyverse)
      
      dat %>% mutate(Diff = TimeStamp - lag(TimeStamp), rownum = row_number()) %>% 
        filter(Diff == 15) %>% 
        slice(1)
      
                  TimeStamp    Diff rownum
      1 2000-01-10 12:45:00 15 mins    457
      

      【讨论】:

        猜你喜欢
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        • 2020-10-06
        • 2021-09-04
        • 2011-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多