R 将时间序列数据子集到定义的间隔中

R 将时间序列数据子集到定义的间隔中,r,time-series,posixct,R,Time Series,Posixct,我试图将数据子集或过滤到定义的时间间隔中。你能帮我把下列数据分成2分钟的时间间隔吗?我已经研究了Lubridate、split()和cut(),但不知道如何正确地执行此操作 我已经看过了,但它似乎不是我需要的 请注意,第1列和第2列是字符类,第3列是POSIXct类。如果可能的话,我想让解决方案使用datetime列(POSIXct) 新子集只需每隔两分钟采集一次数据,如下所示: date time datetime use..kW. gen..kW.

我试图将数据子集或过滤到定义的时间间隔中。你能帮我把下列数据分成2分钟的时间间隔吗?我已经研究了Lubridate、split()和cut(),但不知道如何正确地执行此操作

我已经看过了,但它似乎不是我需要的

请注意,第1列和第2列是字符类,第3列是POSIXct类。如果可能的话,我想让解决方案使用datetime列(POSIXct)

新子集只需每隔两分钟采集一次数据,如下所示:

      date  time            datetime use..kW.     gen..kW. Grid..kW.
121 12/31/2013 21:58 2013-12-31 21:58:00 1.829583 -0.003400000  1.829583
123 12/31/2013 21:56 2013-12-31 21:56:00 2.494750 -0.003350000  2.494750
125 12/31/2013 21:54 2013-12-31 21:54:00 2.008283 -0.003566667  2.008283
127 12/31/2013 21:52 2013-12-31 21:52:00 2.011867 -0.003583333  2.011867
129 12/31/2013 21:50 2013-12-31 21:50:00 2.096550 -0.003850000  2.096550

对于我的数据,我实际上要做5分钟和15分钟的间隔。但是,如果我为上述数据找到了一个很好的解决方案,并且间隔2分钟,我应该能够适当地调整代码以满足我的需要

使用
cut
plyr::ddply

groups <- cut(as.POSIXct(df$datetime), breaks="2 min")
library(plyr)
ddply(df, "groups", tail, 1)[, -1]
#         date  time            datetime use..kW.     gen..kW. Grid..kW.
# 1 12/31/2013 21:50 2013-12-31 21:50:00 2.096550 -0.003850000  2.096550
# 2 12/31/2013 21:52 2013-12-31 21:52:00 2.011867 -0.003583333  2.011867
# 3 12/31/2013 21:54 2013-12-31 21:54:00 2.008283 -0.003566667  2.008283
# 4 12/31/2013 21:56 2013-12-31 21:56:00 2.494750 -0.003350000  2.494750
# 5 12/31/2013 21:58 2013-12-31 21:58:00 1.829583 -0.003400000  1.829583

如果你想把它倒过来排序

不清楚您想做什么,为什么它与时间相关,或者为什么
Data[c(FALSE,TRUE),]
不起作用。我想根据时间间隔筛选数据。在我上面提供的示例数据中,我只想每2分钟进行一次观测,而不是每两分钟计算一次函数,只是在时间间隔对观测值进行子集。这有帮助吗?简单的子集规则,再加上正则表达式,在这里就足够了。例如,对于data.frame
d
d[grep(“[02468]$”,d$time),]
。模式匹配以0、2、4、6或8结尾的任何字符串(时间)。谢谢@lukeA!这似乎接近我所需要的。但是,当我调用ddply()时,它会用NAs填充前两行(21:50和21:52)。你知道它为什么这么做吗?另外,你能告诉我ddply函数的语法吗?NVM,问题是我的df只有六行(原始数据的头部)。代码现在适用于这个小示例。我正在用原始的数据框299466个观测值测试它,需要一段时间。。。你还可以教我ddply函数的语法吗?@stokeinfo well首先,
ddply
通过
组将
df
分割成子数据帧,其中包含每次观察的时间间隔。然后
ddply
将参数为1的
tail
函数应用于每个子数据帧。这将仅返回每行的最后一行。然后,
ddply
将结果绑定在一起并返回数据帧<代码>组将是第一列,
[,-1]
将其排除在外。不知道这是否是你真正需要的,但这是一次尝试。谢谢@lukeA的解释。它工作得很好。多亏了你,我才能够将数据从478000(分钟级观察)行缩减到20899(15分钟间隔)。这将使我的分析速度更快。为了提高速度,像jbaums所提到的那样使用正则表达式进行子集可能会更快,但我想学习一种使用POSIXct格式的解决方案,因此非常感谢您的回答。谢谢@我很高兴它能起作用。PS:plyr的作者最近发布了速度更快的dplyr。也许你也想看看。
groups <- cut(as.POSIXct(df$datetime), breaks="2 min")
library(plyr)
ddply(df, "groups", tail, 1)[, -1]
#         date  time            datetime use..kW.     gen..kW. Grid..kW.
# 1 12/31/2013 21:50 2013-12-31 21:50:00 2.096550 -0.003850000  2.096550
# 2 12/31/2013 21:52 2013-12-31 21:52:00 2.011867 -0.003583333  2.011867
# 3 12/31/2013 21:54 2013-12-31 21:54:00 2.008283 -0.003566667  2.008283
# 4 12/31/2013 21:56 2013-12-31 21:56:00 2.494750 -0.003350000  2.494750
# 5 12/31/2013 21:58 2013-12-31 21:58:00 1.829583 -0.003400000  1.829583
arrange(ddply(df, "groups", tail, 1)[, -1], datetime, decreasing=TRUE)