使用datetimes和lubridate :: dseconds时dplyr :: summarize出错

时间:2017-07-10 14:03:16

标签: r dplyr lubridate

我有一个代表日志消息的tibble。它(以及其他)有两列:

  • FileCreationDateTime 标识消息源自的日志文件,因此用作分组变量。 (把它想象成"文件名")
  • EventDateTime 是某些活动发生的时间

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

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

代码本身似乎没有错误地运行,但我既不能打印结果也不能访问它(至少不是列&#34;持续时间&#34;)因为它返回错误

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

调查,我发现错误似乎取决于日期时间的确切值。我已经把MWE和两个元组放在了一起。两个元素仅在一个值上有所不同。一个工作,而另一个没有。我不知道什么可能导致错误。有人可以开导我吗?

人类可读的语言:

> 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))

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我终于找到了问题。 dplyrlubridate::dseconds没有任何关系。正如已经报道的那样(例如this issue),它在非整数输入上失败&gt;这显然也是我的问题。