列中的过滤时间

时间:2019-05-15 21:05:03

标签: r datetime dplyr lubridate

我在这里尝试了多种可能的解决方案,但是仍然难以根据时间过滤一列。我用lubridate将色谱柱变成hms。请指教。 R的新手,如果这看起来很多余,请道歉。

我尝试了filter命令,但似乎不起作用,因为数据类型错误。角色vs双。我认为这是因为使用了lubridate代码而导致的,但是我在这里可能是错误的。下面是相关部分的代码示例。

这是供参考的数据集的顶部。

> head(iislog1,n=10)
      iisdate    iistime                                 csUriStem timeTaken
1  2019-05-10 4H 35M 10S                              /claraportal      7375
2  2019-05-10 4H 35M 11S                              /claraportal       484
3  2019-05-10 4H 35M 11S                              /claraportal       468
4  2019-05-10 4H 35M 13S                              /claraportal      1024
5  2019-05-10 4H 35M 54S                              /claraportal      5765
6  2019-05-10 4H 35M 57S               /claraportal/content/bundle      2019
7  2019-05-10 4H 35M 57S   /claraportal/dashboard.fwk.style/bundle      2019
8  2019-05-10 4H 35M 57S /claraportal/bundle/css/modules/2019v1_v1      2238
9  2019-05-10 4H 35M 57S           /claraportal/scripts/thirdparty      2457
10 2019-05-10 4H 35M 58S               /claraportal/content/bundle       921


#change data type for date and time columns
iislog$iisdate <- ymd(iislog$iisdate)
iislog$iistime <- hms(iislog$iistime)
#create subset of the original data
iislog1 <- iislog %>% select(iisdate,iistime,csUriStem,timeTaken)
#ensure the csUriStem column is in all lowercase. This is because the URLs
#seem to have mixed case and therefore can show up moe than once.
iislog1$csUriStem <- tolower(iislog1$csUriStem)
#filter the rows to find times between
iislog1 <- filter(iislog1$iistime > '04:40:59' & iislog1$iistime < '21:38:37')

> iislog1 <- filter(iislog1$iistime > '04:40:59' & iislog1$iistime < '21:38:37')
Error in UseMethod("filter_") : 
  no applicable method for 'filter_' applied to an object of class "logical"

2 个答案:

答案 0 :(得分:0)

这是您获取正确格式所需的条件:

iislog1$dtime <- with( iislog1, strptime(paste( iisdate,iistime),
                                         format="%Y-%m-%d %HH %MM %SS"))

我认为您的输入格式与hms函数无法接受的任何典型协议都足够接近。基数R更“完整”。

然后使用正确的“ datetime”值进行比较。或者,如果您想要一个不受日期限制的时间范围,请使用format仅返回时间并进行alpha比较。在您的实例中,“ 21:38:37”与“ 4:40:59”的alpha比较将显示前者“小于”后者,因为前导字母为“ 4”和“ 2”。在正确构造的R日期时间中,“ 4:40:59”的格式版本应为“ 04:40:59”。

答案 1 :(得分:0)

您只是没有传递要过滤的数据框,而是传递了向量。注意区别

# failes
iislog1 <- filter(iislog1$iistime > '04:40:59' & iislog1$iistime < '21:38:37')

# works   |--missing--|   
iislog1 <- iislog1 %>% filter(iislog1$iistime > '04:40:59' & iislog1$iistime < '21:38:37')

tidyverse比基R更为冗长。它可以节省大量费用,而不必每次都为数据框命名(即df$col)。您可以,但是您需要先传递一些信息,例如您不能

df %>% filter(df$col < 2)

但这只是

filter(df$col < 2)

这是因为所有dplyr动词都希望第一个参数是要传递的东西,然后返回一个数据帧。这三件事是相同的

filter(df, col < 2)
df %>% filter(., col < 2)
df %>% filter(col < 2)

因此filter()期望有一个数据帧,而您向它传递了一个向量df$col,它不知道该怎么做。我希望这种解释是有道理的。 《 R for Data Science》一书是这一方面的重要资源,并且可以免费在线获得。

总而言之,执行所有步骤的最佳方法就是这样

library(tidyverse)
library(lubridate)


raw_data <-
  tibble(
    iisdate = "2019-05-10",
    iistime = paste0(1:23, "H 35M 11S"),
    csUriStem = "/ClaraPortal",
    timeTaken = 7375,
    a_column_you_dont_need = "a",
    another_one = "b"
  ) 


iislog <-
  raw_data %>% 
  mutate(
    iisdate = ymd(iisdate),
    iistime = hms(iistime),
    csUriStem = tolower(csUriStem)
  ) %>% 
  select(iisdate:timeTaken) %>% 
  filter(iistime > hms("04:40:59"), iistime < hms("21:38:37"))