在使用datetimes和lubridate :: dseconds时dplyr :: summarize中的错误

问题描述:

我有一个代表日志消息的tibble。它具有(等等)两列:在使用datetimes和lubridate :: dseconds时dplyr :: summarize中的错误

  • FileCreationDateTime识别从该消息始发并且因此旨在作为分组变量的日志文件。 (把它看成是“文件名”)
  • EventDateTime是其中一些事件happend

我现在想要做的是找到的开始时间,结束时间和每个日志文件的持续时间(由FileCreationDateTime标识)。我认为(或思想),这可以用下面的代码来完成:

file_durations <- 
    logMessages%>% 
    group_by(FileCreationDateTime) %>% 
    summarise(start = min(EventDateTime), 
      end = max(EventDateTime), 
      duration = dseconds(end - start)) 

本身似乎运行没有错误的代码,我可以但是没有打印结果,也没有访问它(至少不是列“持续时间”)因为它返回错误

Error in sprintf("%ds (~%s %ss)", x, x2, unit, "s)") : 
    invalid format '%d'; use format %f, %e, %g or %a for numeric objects 

调查,我发现错误似乎取决于日期时间的确切值。我用两个骰子组装了一个MWE。两个骰子只有一个值不同。一个工作,而另一个不工作。我不知道什么可能会导致错误。有人能够启发我吗?

人类可读tibbles:

> working 
# A tibble: 2 × 2 
      EventDateTime FileCreationDateTime 
        <dttm>    <dttm> 
1 2016-11-24 16:16:44.986 2016-11-24 16:16:46 
2 2016-11-24 16:17:43.282 2016-11-24 16:16:46 

> broken 
# A tibble: 2 × 2 
      EventDateTime FileCreationDateTime 
        <dttm>    <dttm> 
1 2016-11-24 16:16:44.986 2016-11-24 16:16:46 
2 2016-11-24 16:18:31.971 2016-11-24 16:16:46 

完整MWE:

library(tidyverse) 
library(lubridate) 

options(digits.secs = 6, digits = 6) 

working <- structure(list(EventDateTime = structure(c(1480004204.987, 1480004263.283), 
                class = c("POSIXct", "POSIXt"), 
                tzone = "UTC"), 
          FileCreationDateTime = structure(c(1480000606, 1480000606), 
                  class = c("POSIXct", "POSIXt"), 
                  tzone = "Europe/Vienna")), 
        .Names = c("EventDateTime", "FileCreationDateTime"), 
        row.names = c(NA, -2L), 
        class = c("tbl_df", "tbl", "data.frame")) 

working %>% 
    group_by(FileCreationDateTime) %>% 
    summarise(start = min(EventDateTime), 
      end = max(EventDateTime), 
      duration = dseconds(end - start)) 

broken <- structure(list(EventDateTime = structure(c(1480004204.987, 1480004311.972), 
                class = c("POSIXct", "POSIXt"), 
                tzone = "UTC"), 
          FileCreationDateTime = structure(c(1480000606, 1480000606), 
                  class = c("POSIXct", "POSIXt"), 
                  tzone = "Europe/Vienna")), 
        .Names = c("EventDateTime", "FileCreationDateTime"), 
        row.names = c(NA, -2L), 
        class = c("tbl_df", "tbl", "data.frame")) 

broken %>% 
    group_by(FileCreationDateTime) %>% 
    summarise(start = min(EventDateTime), 
      end = max(EventDateTime), 
      duration = dseconds(end - start)) 

我,使用R 3.4.0 64位,lubridate_1.6.0和dplyr_0.5.0在Windows 10

感谢您的帮助!

+0

有人可以重现吗? – AEF

我终于找到了问题。它与dplyr没有任何关系,但是lubridate::dseconds。如已经报告过的(例如this issue),它在非整数输入> 60时失败。这显然也是我的问题。