mark
mark

Reputation: 557

Create vector of non-weekend time intervals for part of a day in R

I have a raw dataset of observations taken at 5 minute intervals between 6am and 9pm during weekdays only. These do not come with date-time information for plotting etc so I am attempting to create a vector of date-times to add to this to my data. ie this:

X425 X432 X448 1 0.07994814 0.1513559 0.1293103 2 0.08102852 0.1436480 0.1259074

to this

X425 X432 X448 2010-05-24 06:00 0.07994814 0.1513559 0.1293103 2010-05-24 06:05 0.08102852 0.1436480 0.1259074

I have gone about this as follows:

# using lubridate and xts
library(xts)
library(lubridate)

# sequence of 5 min intervals from 06:00 to 21:00
sttime <- hms("06:00:00")
intervals <- sttime + c(0:180) * minutes(5)

# sequence of days from 2010-05-24 to 2010-11-05
dayseq <- timeBasedSeq("2010-05-24/2010-11-05/d")

# add intervals to dayseq
dayPlusTime <- function(days, times) {
  dd <- NULL
  for (i in 1:2) {
    dd <- c(dd,(days[i] + times))}
  return(dd)
}

obstime <- dayPlusTime(dayseq, intervals)`

But obstime is coming out as a list. days[1] + times works so I guess it's something to do with the way the POSIXct objects are concatenated together to make dd but i can't figure out what am I doing wrong otr where to go next.

Any help appreciated

Upvotes: 1

Views: 212

Answers (2)

Henrik
Henrik

Reputation: 67788

A base alternative:

# create some dummy dates
dates <- Sys.Date() + 0:14

# select non-weekend days
wd <- dates[as.integer(format(dates, format = "%u")) %in% 1:5]

# create times from 06:00 to 21:00 by 5 min interval
times <- format(seq(from = as.POSIXct("2015-02-18 06:00"),
                    to = as.POSIXct("2015-02-18 21:00"),
                    by = "5 min"),
                format = "%H:%M")

# create all date-time combinations, paste, convert to as.POSIXct and sort 
wd_times <- sort(as.POSIXct(do.call(paste, expand.grid(wd, times))))

Upvotes: 1

NicE
NicE

Reputation: 21425

One of the issues is that your interval vector does not change the hour when the minutes go over 60.

Here is one way you could do this:

#create the interval vector
intervals<-c()
for(p in 6:20){
  for(j in seq(0,55,by=5)){
    intervals<-c(intervals,paste(p,j,sep=":"))
  }      
}
intervals<-c(intervals,"21:0")

#get the days
dayseq <- timeBasedSeq("2010-05-24/2010-11-05/d")


#concatenate everything and format to POSIXct at the end
obstime<-strptime(unlist(lapply(dayseq,function(x){paste(x,intervals)})),format="%Y-%m-%d %H:%M", tz="GMT")

Upvotes: 0

Related Questions