按日期和时间选择时间序列对象的间隔

时间:2012-06-16 02:08:25

标签: r date time-series hour

我的问题是如何管理空气质量数据库中的日期和时间,从2002年到2008年,每天每十分钟保存一次数据。

我想生成几个分析和图表,但仅参考从早上6点到早上8点的早上高峰时段,我试图在所需的时间间隔内生成图表,但R工具总是绘制24因此,一天中的小时数会扭曲高峰时段的可用数据。

我非常感谢您就如何在高峰时段选择和绘制间隔以及如何生成多个图表的指导。

我有下一个脚本来生成日期间隔,但我想重新设置小时间隔(早上6-8点)并仅绘制间隔数据:

# select interval
start.date = as.POSIXct("2007-03-27 05:00", tz = "GMT")
end.date = as.POSIXct("2007-05-27 05:00", tz = "GMT")
subdata = subset(mydata, date >= start.date & date <= end.date,
select = c(date, nox, co))
#
#plot the variables

3 个答案:

答案 0 :(得分:5)

我建议您使用时间序列类而不是data.frame。使用xts:

可以轻松地按每天的时间间隔进行子集
# use DWin's example data
Data <- data.frame(a=rnorm(240),
  dtm=as.POSIXct("2007-03-27 05:00", tz="GMT")+3600*(1:240))
# create xts object
library(xts)
x <- xts(Data[,"a"], Data[,"dtm"])
# subset by time of day
y <- x["T06:00/T08:00"]
# plot
plot(y)  # plots all 24 hours of each day
# use chartSeries from quantmod to avoid above behavior
library(quantmod)
chartSeries(y)

答案 1 :(得分:3)

如果您的日期时间位于名为“dtm”的列中,则此代码应获取6A到8A之间的记录

dfrm <- data.frame(a=rnorm(24),  
                   dtm =as.POSIXct("2007-03-27 05:00", tz='GMT') +3600*(1:24) )     
    sub6_8A <- subset(dfrm, strftime(dtm, "%H", tz="GMT") %in% c('06','07','08') )
sub6_8A
           a                 dtm
1  0.5020823 2007-03-27 06:00:00
2 -0.7455312 2007-03-27 07:00:00
3  1.8035086 2007-03-27 08:00:00

你也可以使用带有“[[”的索引方法,但是如果你有NA,他们会被拖延,除非你明确排除它们。

答案 2 :(得分:1)

如果这是一个data.frame,我首先会将每个条目的时间提取到一个新列中,然后用“peak”标记标记每一行,然后使用它变得更容易。同样适用于星期几。由于只有大约350k行,这将是相当快的,这是一次性的,所以你可以做一些丑陋的事情:

# create some fake data
t1 <- as.POSIXct(paste('2012-06-16 0', 1:9, ':00', sep=''), tz='GMT')
N <- length(t1)
mydata <- data.frame(timestamp=t1, co=runif(N, 1,30), nox=runif(N, 5,50))

# extract out the hour of day
mydata$hour <- gsub('^.* ', '', as.character(t1))
# is this a peak time?
mydata$peak <- regexpr('^0[678]', mydata$hour) >0

现在,您可以轻松选择那些来自高峰时段的记录 - 这将是一个小得多的图形子集 - 少于50k的记录。

mypeakdata <- subset(mydata, peak)

由于我确定您将使用不同的假设进行许多此类分析,因此我建议您在数据框中添加各种列,例如一天中的小时,一周中等等,并将它们留在那里,并保存这个大数据。如:

save(mydata, 'mydata_version_2012-06-16_8h58.RData')