【问题标题】:R Find time difference in seconds for YYYY-MM-DD HH:MM:SS.MMM formatR 以秒为单位查找 YYYY-MM-DD HH:MM:SS.MMM 格式的时差
【发布时间】:2012-09-18 15:32:29
【问题描述】:

我正在尝试减去 2 个包含以下格式的日期时间信息的字符向量:

> dput(train2)

structure(list(time2 = c("2011-09-01 23:44:52.533", "2011-09-05 12:25:37.42", 
"2011-08-24 12:56:58.91", "2011-10-25 07:18:14.722", "2011-10-25 07:19:51.697"
), time3 = c("2011-09-01 23:43:59.752", "2011-09-05 12:25:01.187", 
"2011-08-24 12:55:13.012", "2011-10-25 07:16:51.759", "2011-10-25 07:16:51.759"
)), .Names = c("time2", "time3"), row.names = c(NA, 5L), class = "data.frame")

我四处寻找并与zooas.Dateas.POSIXct 等一起玩,试图找到正确的代码来减去 2 个日期时间对象并在几秒钟内得到答案,但没有运气。

如果有任何建议,我将不胜感激。

【问题讨论】:

    标签: r date datetime time


    【解决方案1】:
    >  x1<-"2013-03-03 23:26:46.315" 
    >  x2<-"2013-03-03 23:31:53.091"
    >  x1 <- strptime(x1, "%Y-%m-%d %H:%M:%OS")
    >  x2 <- strptime(x2, "%Y-%m-%d %H:%M:%OS")
    > x1
    [1] "2013-03-03 23:26:46"
    > x2
    [1] "2013-03-03 23:31:53"
    

    我遵循@Dirk Eddelbuettel 的回答,但我正在失去精确度。我怎样才能强制 R 不削减秒的部分?

    谢天谢地(strptime 的人)我自己回答了我的问题:

    op <- options(digits.secs = 3)
    

    应用此设置后,将使用精度。

    http://stat.ethz.ch/R-manual/R-devel/library/base/html/strptime.html

    如果您想在几秒钟内获得差异,但在几分钟内获得差异,以下内容可能会很有用:

    > as.numeric(x2-x1,units="secs")
    [1] 306.776
    

    【讨论】:

      【解决方案2】:

      简单易懂:

      R> now <- Sys.time()
      R> then <- Sys.time()
      R> then - now
      Time difference of 5.357 secs
      R> class(then - now)
      [1] "difftime"
      R> as.numeric(then - now)
      [1] 5.357
      R> 
      

      对于您的数据:

      R> df
                          time2                   time3
      1 2011-09-01 23:44:52.533 2011-09-01 23:43:59.752
      2  2011-09-05 12:25:37.42 2011-09-05 12:25:01.187
      3  2011-08-24 12:56:58.91 2011-08-24 12:55:13.012
      4 2011-10-25 07:18:14.722 2011-10-25 07:16:51.759
      5 2011-10-25 07:19:51.697 2011-10-25 07:16:51.759
      R> df$time2 <- strptime(df$time2, "%Y-%m-%d %H:%M:%OS")
      R> df$time3 <- strptime(df$time3, "%Y-%m-%d %H:%M:%OS")
      R> df
                          time2                   time3
      1 2011-09-01 23:44:52.533 2011-09-01 23:43:59.752
      2 2011-09-05 12:25:37.420 2011-09-05 12:25:01.187
      3 2011-08-24 12:56:58.910 2011-08-24 12:55:13.012
      4 2011-10-25 07:18:14.722 2011-10-25 07:16:51.759
      5 2011-10-25 07:19:51.697 2011-10-25 07:16:51.759
      R> df$time2 - df$time3
      Time differences in secs
      [1]  52.781  36.233 105.898  82.963 179.938
      attr(,"tzone")
      [1] ""
      R> 
      

      并作为数字添加回数据框:

      R> df$dt <- as.numeric(df$time2 - df$time3)
      R> df
                          time2                   time3      dt
      1 2011-09-01 23:44:52.533 2011-09-01 23:43:59.752  52.781
      2 2011-09-05 12:25:37.420 2011-09-05 12:25:01.187  36.233
      3 2011-08-24 12:56:58.910 2011-08-24 12:55:13.012 105.898
      4 2011-10-25 07:18:14.722 2011-10-25 07:16:51.759  82.963
      5 2011-10-25 07:19:51.697 2011-10-25 07:16:51.759 179.938
      R> 
      

      【讨论】:

      • 非常感谢。我自己永远不会得到那个。日期时间的东西对我来说是一个“已知的未知数”(借用唐拉姆斯菲尔德的话)。
      • 可能值得指出的是,您可以使用difftime(then,now,units="secs")difftime(then,now,units="mins") 等将时间差强制为特定的时间单位...参见?difftime
      • @screechOwl:与 R 的许多东西一样,它有时需要一些头部抓挠和额头撞击,但它非常非常强大。绝对值得学习。
      • 这个答案可能不正确。默认情况下,difftime 对象具有units = "auto",因此以最合适的单位呈现(类似于最小单位,单位大小一致且绝对差异大于一)。 as.numeric 应该使用 units = "secs"
      • 这不是原始问题和数据集的一部分,所以我(有点强烈)不同意评论(并投反对票)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 2021-12-18
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      相关资源
      最近更新 更多