从每小时提取/子集分钟值

时间:2018-04-05 09:52:11

标签: r subset grepl

我的数据框包含125,000多行格式YYYY-MM-DD HH-MM-SS的日期值,按分钟细分(每行代表一分钟)。

1 2018-01-01 00:04:00
2 2018-01-01 00:05:00
3 2018-01-01 00:06:00
4 2018-01-01 00:07:00
5 2018-01-01 00:08:00
6 2018-01-01 00:09:00
...
124998 2018-03-29 05:07:00
124999 2018-03-29 05:08:00
125000 2018-03-29 05:09:00

我希望通过提取任何给定小时内的所有分钟值并将结果保存到单个数据框来对数据进行子集化。

我使用subset()grepl()相结合无济于事。我尝试过设置start =stop =参数,但也无济于事。

我想要做的是每个HH值,我想提取具有相应HH值的所有行,然后为每个相应的HH值创建一个新的数据框。 / p>

例如,我希望有一个数据框对应于每分钟的值(整个小时的数据价值),从而产生如下数据框:

  • 2018-01-01 00:00:00(包含2018-01-01 00:00:002018-01-01 00:59:00(含)的数据)
  • 2018-01-01 01:00:00(包含2018-01-01 01:00:002018-01-01 01:59:00(含)的数据)

等等。

有没有快速实现这一目标的方法,还是一项更费力的工作?

注意:我知道我想要的结果会产生很多数据帧,这对我的特定项目来说很好,因为我一次只能处理一个小时的块。< /强>

3 个答案:

答案 0 :(得分:3)

这将生成按小时分组的数据框列表,假设您的数据框名为data且第一列为V1

split(data, format(data$V1, "%Y-%m-%d %H"))

答案 1 :(得分:0)

我提出了一个解决方案,它从主数据框中提取每分钟($0)值/行:

MM

要将每小时分开,我将根据我想要关注的小时更改第一个df <- buckets[grepl("00:\\d+:00$", buckets$time), ] ,然后我可以执行类似的功能来提取每个单独的日期值。

答案 2 :(得分:0)

如果您想访问每个日期值,lubridate具有默认功能。

library(lubridate)
data %>% mutate(year = year(x), month = month(x), day = day(x), hour = hour(x))

所以你可以通过以下方式获得相同的分裂(但是以更加繁琐的方式):

data %>% mutate(year = year(x), month = month(x), day = day(x), hour = hour(x))  %>%
  group_by(year, month, day, hour) %>% 
  split(list(.$year, .$month, .$day, .$hour))

虚拟数据

x <- seq(as.POSIXct("2018-01-01 00:00:00"), as.POSIXct("2018-01-04 59:59:59"), length.out = 1000)
data <- data.frame(x)