Dear List, I have a data frame of data taken every few seconds. I would like to subset the data to retain only the data taken on the quarter hour, and as close to the quarter hour as possible. So far I have figured out how to subset the data to the quarter hour, but not how to keep only the minimum time for each quarter hour. For example: mytime<-c("12:00:00","12:00:05","12:15:05","12:15:06","12:20:00","12:30:01","12:45:01","13:00:00","13:15:02") subtime<-grep(pattern="[[:digit:]]+[[:punct:]]00[[:punct:]][[:digit:]]+|[[:digit:]]+[[:punct:]]15[[:punct:]][[:digit:]]+|[[:digit:]]+[[:punct:]]30[[:punct:]][[:digit:]]+|[[:digit:]]+[[:punct:]]45[[:punct:]][[:digit:]]+",mytime) mytime[subtime] [1] "12:00:00" "12:00:05" "12:15:05" "12:15:06" "12:30:01" "12:45:01" "13:00:00" "13:15:02" This gives me the data taken at quarter hour intervals (removes 12:20:00) but I am still left with multiple values at the quarter hours. I would like to obtain: "12:00:00" "12:15:05" "12:30:01" "12:45:01" "13:00:00" "13:15:02" Thanks! Tim Tim Clark Department of Zoology University of Hawaii
Here is one way to do it:> mytime<-c("12:00:00","12:00:05","12:15:05","12:15:06","12:20:00","12:30:01","12:45:01","13:00:00","13:15:02") > # you might want a date on your data > x <- as.POSIXct(mytime, format="%H:%M:%S") > # create quarter hour intervals for the data range > quarter <- seq(trunc(min(x), 'days'), trunc(max(x) + 86400, 'days'), by='15 min') # add 86400 to add a day for truncation > # cut the data by quarter hours and then take the first value in each group > x.s <- sapply(split(x, cut(x, breaks=quarter), drop=TRUE), '[', 1) > # lost the 'class' for some reason; put it back > class(x.s) <- c("POSIXt", "POSIXct") > # the answer > x.s2009-08-14 12:00:00 2009-08-14 12:15:00 2009-08-14 12:30:00 2009-08-14 12:45:00 2009-08-14 13:00:00 "2009-08-14 12:00:00 EDT" "2009-08-14 12:15:05 EDT" "2009-08-14 12:30:01 EDT" "2009-08-14 12:45:01 EDT" "2009-08-14 13:00:00 EDT" 2009-08-14 13:15:00 "2009-08-14 13:15:02 EDT">On Thu, Aug 13, 2009 at 4:10 PM, Tim Clark<mudiver1200 at yahoo.com> wrote:> Dear List, > > I have a data frame of data taken every few seconds. ?I would like to subset the data to retain only the data taken on the quarter hour, and as close to the quarter hour as possible. ?So far I have figured out how to subset the data to the quarter hour, but not how to keep only the minimum time for each quarter hour. > > For example: > mytime<-c("12:00:00","12:00:05","12:15:05","12:15:06","12:20:00","12:30:01","12:45:01","13:00:00","13:15:02") > subtime<-grep(pattern="[[:digit:]]+[[:punct:]]00[[:punct:]][[:digit:]]+|[[:digit:]]+[[:punct:]]15[[:punct:]][[:digit:]]+|[[:digit:]]+[[:punct:]]30[[:punct:]][[:digit:]]+|[[:digit:]]+[[:punct:]]45[[:punct:]][[:digit:]]+",mytime) > mytime[subtime] > > [1] "12:00:00" "12:00:05" "12:15:05" "12:15:06" "12:30:01" "12:45:01" "13:00:00" "13:15:02" > > This gives me the data taken at quarter hour intervals (removes 12:20:00) but I am still left with multiple values at the quarter hours. > > I would like to obtain: > > "12:00:00" "12:15:05" "12:30:01" "12:45:01" "13:00:00" "13:15:02" > > Thanks! > > Tim > > > > > Tim Clark > Department of Zoology > University of Hawaii > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem that you are trying to solve?
Try this also: times <- as.POSIXlt(mytime, format = "%H:%M:%S") subTimes <- times[times[['min']] %in% c(0,15,30,45)] format(subTimes[!duplicated(format(subTimes, "%H:%M"))], "%H:%M:%S") On Thu, Aug 13, 2009 at 5:10 PM, Tim Clark <mudiver1200@yahoo.com> wrote:> Dear List, > > I have a data frame of data taken every few seconds. I would like to > subset the data to retain only the data taken on the quarter hour, and as > close to the quarter hour as possible. So far I have figured out how to > subset the data to the quarter hour, but not how to keep only the minimum > time for each quarter hour. > > For example: > > mytime<-c("12:00:00","12:00:05","12:15:05","12:15:06","12:20:00","12:30:01","12:45:01","13:00:00","13:15:02") > > subtime<-grep(pattern="[[:digit:]]+[[:punct:]]00[[:punct:]][[:digit:]]+|[[:digit:]]+[[:punct:]]15[[:punct:]][[:digit:]]+|[[:digit:]]+[[:punct:]]30[[:punct:]][[:digit:]]+|[[:digit:]]+[[:punct:]]45[[:punct:]][[:digit:]]+",mytime) > mytime[subtime] > > [1] "12:00:00" "12:00:05" "12:15:05" "12:15:06" "12:30:01" "12:45:01" > "13:00:00" "13:15:02" > > This gives me the data taken at quarter hour intervals (removes 12:20:00) > but I am still left with multiple values at the quarter hours. > > I would like to obtain: > > "12:00:00" "12:15:05" "12:30:01" "12:45:01" "13:00:00" "13:15:02" > > Thanks! > > Tim > > > > > Tim Clark > Department of Zoology > University of Hawaii > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- Henrique Dallazuanna Curitiba-Paraná-Brasil 25° 25' 40" S 49° 16' 22" O [[alternative HTML version deleted]]
Converting to "times" class we can use trunc.times to truncate to 15 minutes and then use tapply to get the indices, ix.> library(chron) > tc <- times(mytime) > ix <- tapply(seq_along(tc), trunc(tc, "00:15:00"), head, 1) > tc[ix][1] 12:00:00 12:15:05 12:30:01 12:45:01 13:00:00 13:15:02 Note that "times" class assumes hour cannot be greater than 23 which is ok at least for the data in your example. On Thu, Aug 13, 2009 at 4:10 PM, Tim Clark<mudiver1200 at yahoo.com> wrote:> Dear List, > > I have a data frame of data taken every few seconds. ?I would like to subset the data to retain only the data taken on the quarter hour, and as close to the quarter hour as possible. ?So far I have figured out how to subset the data to the quarter hour, but not how to keep only the minimum time for each quarter hour. > > For example: > mytime<-c("12:00:00","12:00:05","12:15:05","12:15:06","12:20:00","12:30:01","12:45:01","13:00:00","13:15:02") > subtime<-grep(pattern="[[:digit:]]+[[:punct:]]00[[:punct:]][[:digit:]]+|[[:digit:]]+[[:punct:]]15[[:punct:]][[:digit:]]+|[[:digit:]]+[[:punct:]]30[[:punct:]][[:digit:]]+|[[:digit:]]+[[:punct:]]45[[:punct:]][[:digit:]]+",mytime) > mytime[subtime] > > [1] "12:00:00" "12:00:05" "12:15:05" "12:15:06" "12:30:01" "12:45:01" "13:00:00" "13:15:02" > > This gives me the data taken at quarter hour intervals (removes 12:20:00) but I am still left with multiple values at the quarter hours. > > I would like to obtain: > > "12:00:00" "12:15:05" "12:30:01" "12:45:01" "13:00:00" "13:15:02" > > Thanks! > > Tim > > > > > Tim Clark > Department of Zoology > University of Hawaii > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >