我一直试图以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和编码的新手,所以我们将不胜感激!
答案 0 :(得分:0)
由于日期并不重要,并且您只对时间部分感兴趣,因此可以将日期更改为今天。同样,您似乎对从00:00:00
到00: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))