【问题标题】:Filter Time in Column列中过滤时间
【发布时间】:2019-05-15 21:05:02
【问题描述】:

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

我尝试了过滤器命令,但似乎不起作用,因为数据类型错误。字符与双重。我认为由于 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"

【问题讨论】:

  • 当前您正在将日期类与字符串进行比较,请将您的日期/时间字符串转换为日期类。
  • 用另一种方式说明 zx8754 的观点:iislog1$iistime 可能是类datetime,但'04:40:59' 只是一个character
  • 其实iislog$iistime转换后iislog$iistime &lt;- hms(iislog$iistime)就是类Period(见??hms)。因此,为了比较,请将您的时间字符串转换为 hms():iislog1.filtered &lt;- filter(iislog1, iistime &gt; hms('04:35:10') &amp; iistime &lt; hms('21:38:37'))
  • 我会试试的。所以,基本上,你的意思是甚至将它转换为 hms 都没有意义?如果我只是保留最初的数据,这可能是字符,我会没事的吗?

标签: r datetime dplyr lubridate


【解决方案1】:

以下是获得正确格式所需的内容:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 2021-01-17
      • 2010-12-27
      • 2021-03-02
      • 1970-01-01
      • 2014-05-13
      • 2016-04-23
      相关资源
      最近更新 更多