【问题标题】:Filter R data frame by hour of the day按一天中的小时过滤 R 数据帧
【发布时间】:2019-07-27 03:07:27
【问题描述】:

我有一个带有日期时间列的数据框。我想知道一天中每小时的行数。但是,我只关心上午 8 点到晚上 10 点之间的行。

lubridate 包要求我们使用 24 小时惯例过滤一天中的时间。

library(tidyverse)
library(lubridate)

### Fake Data with Date-time ----
x <- seq.POSIXt(as.POSIXct('1999-01-01'), as.POSIXct('1999-02-01'), length.out=1000)

df <- data.frame(myDateTime = x)

### Get all rows between 8 AM and 10 PM (inclusive)

df %>% 
  mutate(myHour = hour(myDateTime)) %>% 
  filter(myHour >= 8, myHour <= 22) %>%  ## between 8 AM and 10 PM (both inclusive)
  count(myHour) ## number of rows

有没有办法让我使用10:00 PM 而不是整数22

【问题讨论】:

    标签: r lubridate


    【解决方案1】:

    你也可以使用 base R 来做到这一点

    #Extract the hour 
    df$hour_day <- as.numeric(format(df$myDateTime, "%H"))
    
    #Subset data between 08:00 AM and 10:00 PM
    new_df <- df[df$hour_day >= as.integer(format(as.POSIXct("08:00 AM", 
          format = "%I:%M %p"), "%H")) & as.integer(format(as.POSIXct("10:00 PM", 
          format = "%I:%M %p"), "%H")) >= df$hour_day, ]
    #Count the frequency
    stack(table(new_df$hour_day))
    
    #   values ind
    #1      42   8
    #2      42   9
    #3      41  10
    #4      42  11
    #5      42  12
    #6      41  13
    #7      42  14
    #8      41  15
    #9      42  16
    #10     42  17
    #11     41  18
    #12     42  19
    #13     42  20
    #14     41  21
    #15     42  22
    

    这给出了与tidyverse/lubridate 方法相同的输出

    library(tidyverse)
    library(lubridate)
    
    df %>% 
      mutate(myHour = hour(myDateTime)) %>% 
      filter(myHour >= hour(ymd_hm("2000-01-01 8:00 AM")), 
             myHour <= hour(ymd_hm("2000-01-01 10:00 PM"))) %>%  
      count(myHour)
    

    【讨论】:

      【解决方案2】:

      您可以使用 ymd_hmhour 函数进行 12 小时到 24 小时的转换。

      df %>% 
        mutate(myHour = hour(myDateTime)) %>% 
        filter(myHour >= hour(ymd_hm("2000-01-01 8:00 AM")), ## hour() ignores year, month, date
               myHour <= hour(ymd_hm("2000-01-01 10:00 PM"))) %>%  ## between 8 AM and 10 PM (both inclusive)
        count(myHour)
      
      

      更优雅的解决方案。

      ## custom function to convert 12 hour time to 24 hour time
      
      hourOfDay_12to24 <- function(time12hrFmt){
        out <- paste("2000-01-01", time12hrFmt)
        out <- hour(ymd_hm(out))
        out
      }
      
      df %>% 
        mutate(myHour = hour(myDateTime)) %>% 
        filter(myHour >= hourOfDay_12to24("8:00 AM"),
               myHour <= hourOfDay_12to24("10:00 PM")) %>%  ## between 8 AM and 10 PM (both inclusive)
        count(myHour)
      
      

      【讨论】:

        猜你喜欢
        • 2011-08-28
        • 2019-10-24
        • 1970-01-01
        • 1970-01-01
        • 2022-07-29
        • 1970-01-01
        • 1970-01-01
        • 2021-05-07
        • 1970-01-01
        相关资源
        最近更新 更多