Выбрать интервал объекта временного ряда по дате и времени

У меня вопрос о том, как управлять датой и временем в базе данных качества воздуха, которая сохраняла данные каждые десять минут в течение всего дня, каждый день с 2002 по 2008 год.

Я хочу создать несколько анализов и графиков, но, имея в виду только утренние часы пик, которые идут с 6:00 до 8:00 утра, я пытался сгенерировать диаграммы в необходимом интервале, но инструмент 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

person Leonardo Cantor    schedule 16.06.2012    source источник
comment
Подумайте о включении небольшого набора данных, если хотите, поддельных данных. Также рассмотрите возможность включения желаемого результата для этого набора данных.   -  person Mark Miller    schedule 16.06.2012
comment
Вы смотрели пакет lubridate? Он может делать то, что вам нужно, но трудно привести примеры без воспроизводимых данных.   -  person Maiasaura    schedule 16.06.2012
comment
К вашему сведению, многие люди предпочли бы использовать ‹- вместо = для назначения в R.   -  person Sean    schedule 16.06.2012


Ответы (3)


Я рекомендую вам использовать класс временных рядов вместо 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)
person Joshua Ulrich    schedule 16.06.2012

Если ваша дата-время находится в столбце с именем '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, они будут перетаскиваться, если вы специально не исключите их.

person IRTFM    schedule 16.06.2012
comment
Также подмножество (dfrm, as.POSIXlt (Data $ dtm) $ hour% в% c (6,7,8)) - person Sean; 16.06.2012

Если бы это был data.frame, я бы начал с извлечения времени дня для каждой записи в новый столбец, а затем пометил бы каждую строку флажком «пик», и тогда работать с ним стало бы намного проще. То же для дня недели. Поскольку строк всего около 350 тыс., Это будет достаточно быстро и одноразово, так что вы можете сделать что-нибудь уродливое, например:

# 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

Теперь вы можете легко выбрать только те записи, которые относятся к часам пиковой нагрузки - это гораздо меньшее подмножество для графического отображения - менее 50 тыс. Записей.

mypeakdata <- subset(mydata, peak)

Поскольку я уверен, что вы собираетесь проводить много таких анализов с разными гипотезами, я предлагаю вам добавить в свой data.frame различные столбцы, такие как час дня, день недели и т. Д., И оставить их там, и просто сохраните этот большой data.frame, например:

save(mydata, 'mydata_version_2012-06-16_8h58.RData')
person Sean    schedule 16.06.2012
comment
+1 Меня удивило, что as.character.POSIXt вернул отформатированный объект даты и времени, хотя глядя на код, можно понять, почему. - person IRTFM; 16.06.2012
comment
Большое спасибо за ответы, я пытаюсь управлять своими данными с их помощью - person Leonardo Cantor; 27.06.2012