如何按小时选择数据

时间:2019-05-24 02:12:37

标签: r time split

我一直试图以30分钟为间隔分割数据,但是我找不到解决该问题的方法,日期和时间是date_time变量。我只想能够根据日期不重要的时间制作df

我尝试过仅通过将日期格式化为时间来分割数据,但这也没有用。

这就是df的样子

    Date_Time              S     C     P
    2016-08-02 21:14:52   20     1     1
    2016-08-02 21:26:37   35     1     2
    2016-09-07 21:31:33   28     1     8
    2016-08-25 21:46:16   23     3     4 
    2016-08-24 21:54:23   40     1     6

如果我将df设置在21:00:00-21:30:00之间,则它看起来像:

    Date_Time              S     C     P
    2016-08-02 21:14:52   20     1     1
    2016-08-02 21:26:37   35     1     2

我是r和编码的新手,所以我们将不胜感激!

2 个答案:

答案 0 :(得分:0)

由于日期并不重要,并且您只对时间部分感兴趣,因此可以将日期更改为今天。同样,您似乎对从00:00:0000:30:00的半小时间隔感兴趣,依此类推。我们可以为全天创建POSIXct个时间间隔的序列,并根据该间隔split个数据。

df$Date_Time1 <- as.POSIXct(format(df$Date_Time, paste0(Sys.Date(), "%T")))

split(df[-5], droplevels(cut(df$Date_Time1, 
   breaks  = seq(as.POSIXct("00:00:00", format = "%T"), 
                 as.POSIXct("23:59:59", format = "%T"), by = "30 mins"))))


#$`2019-05-24 21:00:00`
#        Date_Time  S C P
#1 2016-08-02 21:14:52 20 1 1
#2 2016-08-02 21:26:37 35 1 2

#$`2019-05-24 21:30:00`
#            Date_Time  S C P
#3 2016-09-07 21:31:33 28 1 8
#4 2016-08-25 21:46:16 23 3 4
#5 2016-08-24 21:54:23 40 1 6

这将返回一个数据帧列表,其中每个数据帧都是该时间间隔中的行。假设您的Date_Time列已经属于POSIXct类。如果不是,则需要先进行更改。

df$Date_Time <- as.POSIXct(df$Date_Time)

答案 1 :(得分:0)

这是tidyverse的一个选项。我们可以根据30分钟的间隔floor来确定“日期时间”,并用它来split进入list s的data.frame

library(lubridate)
library(tidyverse)
df1 %>% 
  mutate(grp = format(floor_date(ymd_hms(Date_Time), '30 min'), '%H:%M:%S')) %>% 
  group_split(grp, keep = FALSE)
#[[1]]
# A tibble: 2 x 4
#  Date_Time               S     C     P
#  <chr>               <int> <int> <int>
#1 2016-08-02 21:14:52    20     1     1
#2 2016-08-02 21:26:37    35     1     2

#[[2]]
# A tibble: 3 x 4
#  Date_Time               S     C     P
#  <chr>               <int> <int> <int>
#1 2016-09-07 21:31:33    28     1     8
#2 2016-08-25 21:46:16    23     3     4
#3 2016-08-24 21:54:23    40     1     6

数据

df1 <- structure(list(Date_Time = c("2016-08-02 21:14:52", "2016-08-02 21:26:37", 
"2016-09-07 21:31:33", "2016-08-25 21:46:16", "2016-08-24 21:54:23"
), S = c(20L, 35L, 28L, 23L, 40L), C = c(1L, 1L, 1L, 3L, 1L), 
    P = c(1L, 2L, 8L, 4L, 6L)), class = "data.frame", row.names = c(NA, 
-5L))