【问题标题】:Calculating difference between two timestamps in R; NA appears alongside time difference output计算 R 中两个时间戳之间的差异; NA 出现在时差输出旁边
【发布时间】:2023-03-12 20:05:02
【问题描述】:

我正在计算数据框中两个时间戳之间的小时差。一个时间戳在前一行,即lasttime,另一个在前一行,即origtime。这是一个小例子:-

library(dplyr)
df<-structure(list(DateTime_Start = structure(c(1612284131.736, 1612296614.851
), tzone = "UTC", class = c("POSIXct", "POSIXt")), DateTime_End = structure(c(1612284195.736, 
                                                                              1612296715.851), tzone = "UTC", class = c("POSIXct", "POSIXt"
                                                                              ))), row.names = c(NA, -2L), class = "data.frame")

df

#       DateTime_Start        DateTime_End
#1 2021-02-02 16:42:11 2021-02-02 16:43:15
#2 2021-02-02 20:10:14 2021-02-02 20:11:55

lasttime<-lag(df$DateTime_End)
lasttime
#[1] NA                        "2021-02-02 16:43:15 UTC"

origtime<-lead(df$DateTime_Start)
origtime
#[1] "2021-02-02 20:10:14 UTC" NA

您可以注意到,它在lasttimeorigtime 的每次运行旁边返回一个NA,似乎是df 中行上另一个时间戳的占位符。然后当我尝试计算difftime 时,我得到了这个:-

difftime(origtime,lastime)
#Time differences in secs
#[1] NA NA

我认为这是由origtimelasttime 中的NA 引起的。谁能指出一个解决方案来区分这两个日期时间对象?

非常感谢!

【问题讨论】:

    标签: r dplyr lag lead difftime


    【解决方案1】:

    默认情况下lag 的第一个值和lead 的最后一个值始终为NA。因为lag 中没有第一行的上一个值,lead 中最后一行也没有下一个值。

    您需要更改default 的值以获取不是NA 的值。例如,要将 0 作为第一个值,您可以这样做 -

    library(dplyr)
    
    df %>%
      mutate(difference = difftime(DateTime_Start, lag(DateTime_End, default = first(DateTime_Start)), units = 'hours'))
    
    #       DateTime_Start        DateTime_End     difference
    #1 2021-02-02 16:42:11 2021-02-02 16:43:15 0.000000 hours
    #2 2021-02-02 20:10:14 2021-02-02 20:11:55 3.449754 hours
    

    在第二行中,您正在计算 DateTime_Start[2] - DateTime_End[1]。如果您在第 3 行中有超过 2 行,您将获得 DateTime_Start[3] - DateTime_End[2] 的输出,依此类推。

    【讨论】:

      【解决方案2】:

      Lag 和 Lead 正在寻找之前和未来的时间戳。如果没有,则返回 NA。如果那不是您想要的行为,您想要什么行为?

      您有 4 个时间戳。我完全不知道你想用什么来计算差异!

      您是否要从第一个开始时间和最后一个结束时间中获取差异?

      difftime(min(df$DateTime_Start), max(df$DateTime_End))
      

      如果您向数据添加第三行,您将获得中间行的 difftime。添加 200 行,您将获得 200 个结果和两个 NA。

      【讨论】:

      • 我试图找出第一行的DateTime_End 和第二行的DateTime_Start 之间的区别。正如您所推断的那样,lag()lead() 不合适,那么我可以使用什么作为替代方案?
      猜你喜欢
      • 2020-05-13
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多