Я бы использовал класс временных рядов, такой как xts
dat <- read.table(text="2011-10-24 01:00:00 12
2011-10-24 02:00:00 4
2011-10-24 19:00:00 18
2011-10-24 20:00:00 7
2011-10-24 21:00:00 4
2011-10-24 22:00:00 2
2011-10-25 00:00:00 4
2011-10-25 01:00:00 2
2011-10-25 02:00:00 2
2011-10-25 15:00:00 12
2011-10-25 18:00:00 2
2011-10-25 19:00:00 3
2011-10-25 21:00:00 2
2011-10-25 23:00:00 9
2011-10-26 00:00:00 13
2011-10-26 01:00:00 11", header=FALSE, stringsAsFactors=FALSE)
xobj <- xts(dat[, 3], as.POSIXct(paste(dat[, 1], dat[, 2])))
Подмножество xts очень интуитивно понятно. Для всех данных на "2011-10-25" сделайте это
xobj["2011-10-25"]
# [,1]
#2011-10-25 00:00:00 4
#2011-10-25 01:00:00 2
#2011-10-25 02:00:00 2
#2011-10-25 15:00:00 12
#2011-10-25 18:00:00 2
#2011-10-25 19:00:00 3
#2011-10-25 21:00:00 2
#2011-10-25 23:00:00 9
Вы также можете разделить временные промежутки, подобные этому (все данные между 24.10.2011 и 25.10.2011 включительно).
xobj["2011-10-24/2011-10-25"]
Или, если вам нужны все данные за октябрь 2011 г.,
xobj["2011-10"]
Если вы хотите получить все данные за любой день с 19:00 до 20:00,
xobj['T19:00:00/T20:00:00']
# [,1]
#2011-10-24 19:00:00 18
#2011-10-24 20:00:00 7
#2011-10-25 19:00:00 3
Вы можете использовать функцию endpoints
, чтобы найти строки, которые являются последними строками периода времени («часы», «дни», «недели» и т. д.).
endpoints(xobj, "days")
[1] 0 6 14 16
Или вы можете преобразовать в более низкую частоту
to.weekly(xobj)
# xobj.Open xobj.High xobj.Low xobj.Close
#2011-10-26 12 18 2 11
to.daily(xobj)
# xobj.Open xobj.High xobj.Low xobj.Close
#2011-10-25 12 18 2 2
#2011-10-26 4 12 2 9
#2011-10-26 13 13 11 11
Обратите внимание, что в приведенном выше примере создаются столбцы для Open, High, Low и Close. Если вам нужны данные только на конечных точках, вы можете использовать OHLC=FALSE
to.daily(xobj, OHLC=FALSE)
# [,1]
#2011-10-25 2
#2011-10-26 9
#2011-10-26 11
Дополнительные базовые поднастройки и многое другое можно найти на странице http://www.quantmod.com/examples/.
Как упоминает @JoshuaUlrich в комментариях, split.xts
НЕВЕРОЯТНО полезен.
Вы можете разделить по дням (или неделям, или месяцам и т. д.), применить функцию, а затем рекомбинировать
split(xobj, 'days') #create a list where each element is the data for a different day
#[[1]]
# [,1]
#2011-10-24 01:00:00 12
#2011-10-24 02:00:00 4
#2011-10-24 19:00:00 18
#2011-10-24 20:00:00 7
#2011-10-24 21:00:00 4
#2011-10-24 22:00:00 2
#
#[[2]]
# [,1]
#2011-10-25 00:00:00 4
#2011-10-25 01:00:00 2
#2011-10-25 02:00:00 2
#2011-10-25 15:00:00 12
#2011-10-25 18:00:00 2
#2011-10-25 19:00:00 3
#2011-10-25 21:00:00 2
#2011-10-25 23:00:00 9
#
#[[3]]
# [,1]
#2011-10-26 00:00:00 13
#2011-10-26 01:00:00 11
Предположим, вам нужно только первое значение каждого дня. split
по дням, lapply
функция first
и rbind
обратно вместе.
do.call(rbind, lapply(split(xobj, 'days'), first))
# [,1]
#2011-10-24 01:00:00 12
#2011-10-25 00:00:00 4
#2011-10-26 00:00:00 13
person
GSee
schedule
06.07.2012