2016-05-14 1 views
1

Я понимаю, что на подобные вопросы был дан ответ. Моя проблема заключается в том, что у меня есть данные временных рядов за 2033 дня с интервалом 15 минут. Я хотел бы построить серию за каждый день (Mon-Sun). Например, как выглядит средний понедельник.xts - как подмножество на каждый день недели

Я попытался подмножество с помощью .indexwday, но серия на день начинается в 13:00.

Я как бы новичок, поэтому, пожалуйста, дайте мне знать, если мне нужно предоставить дополнительную информацию.

Пример данных (XTS)

  • 2008-01-01 00:00:00 16
  • 2008-01-01 00:15:00 56
  • 2008-01-01 00: 30:00 136
  • 2008-01-01 00:45:00 170
  • 2008-01-01 01:00:00 132

....

  • 2013-07-25 22:30:00 95
  • 2013-07-25 22:45:00 82
  • 2013-07-25 23:00:00 66
  • 2013-07 -25 23:15:00 65
  • 2013-07-25 23:30:00 66
  • 2013-07-25 23:45:00 46

участок ниже может иметь больше смысла, что Я хочу (это средний по понедельникам)

enter image description here

+0

могли бы вы предоставить фрагмент данных, если это не чувствительно делиться? Если это так, то, пожалуйста, предоставьте тот, который похож по размеру и структуре. – Abdou

ответ

3

Вот еще одно решение, которое не зависит от пакетов, отличных от xts и зоопарка.

# example data 
ix <- seq(as.POSIXct("2008-01-01"), as.POSIXct("2013-07-26"), by="15 min") 
set.seed(21) 
x <- xts(sample(200, length(ix), TRUE), ix) 

# aggregate by 15-minute observations for each weekday 
a <- lapply(split.default(x, format(index(x), "%A")),   # split by weekday 
    function(x) aggregate(x, format(index(x), "%H:%M"), mean)) # aggregate by 15-min 
# merge aggregated data into one zoo object, ordering columns 
z <- do.call(merge, a)[,c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")] 
# convert index to POSIXct to make plotting easier 
index(z) <- as.POSIXct(index(z), format="%H:%M") 
# plot 
plot(z, type="l", nc=1, ylim=range(z), main="Average daily volume", las=1) 

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

enter image description here

1

Попробуйте это:

#Get necessary packages 
install.packages("lubridate") 
install.packages("magrittr") 
install.packages("dplyr") 
install.packages("ggplot2") 
install.packages("scales") 

#Import packages 
library(lubridate,warn=F) 
library(dplyr,warn=F) 
library(magrittr) 
library(ggplot2,warn=F) 
library(scales, warn=F) 

#Getting the data 
tstart = as.POSIXct('2008-01-01 00:00:00') 
tend = as.POSIXct('2013-07-25 23:45:00') 
ttimes <- seq(from = tstart,to=tend,by='15 mins') 
tvals <- sample(seq(1,200),length(ttimes),T) 
tsdata <- data.frame(Dates=ttimes,Vals=tvals) 
tsdata <- tsdata %>% mutate(DayofWeek = wday(Dates,label=T), Hours = as.POSIXct(strftime(Dates,format="%H:%M:%S"),format="%H:%M:%S")) 

#Pick a day at a time. I am using Mondays for this example. 
tsdata_monday <- tsdata %>% filter(DayofWeek=='Mon') %>% group_by(Hours) %>% summarise(meanVals=mean(Vals)) %>% as.data.frame() 

#Plotting the graph of mean values versus times for Monday: 
ggplot(tsdata_monday) + aes(x=Hours,y=meanVals) + geom_line() + scale_x_datetime(breaks=date_breaks("4 hour"), labels=date_format("%H:%M")) 

Monday plot

#If you want you can go ahead and plot all the days. But please keep in mind 
#that this does not look good at all. Too many plots for the plot window to 
#Display nicely. 
alltsdata <- tsdata %>% group_by(DayofWeek, Hours) %>% summarise(MeanVals=mean(Vals)) %>% as.data.frame() 

ggplot(alltsdata) + aes(x=Hours,y=MeanVals) + geom_line() + scale_x_datetime(breaks=date_breaks("4 hour"), labels=date_format("%H:%M")) + facet_grid(.~DayofWeek) 

Full plot

Я рекомендую вам построить один день за один раз или использовать for loop или одну из функции apply вариации для получения e.

Также при фильтрации по дням недели, пожалуйста, имейте в виде, что дни укорачиваются следующим образом:

unique(tsdata$DayofWeek) 
[1] Tues Wed Thurs Fri Sat Sun Mon 

Надеется, что это помогает.

0

apply.daily делает именно то, что вы хотите.(Assumming данных называется d.xts и XTS-объекта)

apply.daily(d.xts,sum) 

другое решение будет использовать aggregate:

aggregate(d.xts,as.Date(index(d.xts)),sum) 

Обратите внимание, что ответы слегка отличаются: apply.daily начинается с start(d.xts) to end(d.xts), тогда как aggregate проходит день с полуночи до полуночи.