简体   繁体   中英

Convert time series with 3-seconds update to time series with other interval

I have a large file of measurements with 3-second period ( here is a small part of it). I made time serie:

library(zoo)
fmt<-"%d.%m.%y %H:%M:%S"
dat <- read.zoo("~/Institut/Monitor/UA_test.csv",header=TRUE,
           dec=".",sep='\t',tz='',format=fmt,index=1)

On the next step I need convert it to the time series with 3 minutes update interval, where values must be the averages. What is the simplest way to do this?

Use aggregate.zoo :

aggregate(dat, as.POSIXct(cut(index(dat), "3 min")), mean)

Note that dec="." and index=1 are used by default in read.zoo so they could be omitted from the read.zoo line.

You can use the period.apply from the xts package

library(xts)
(x <- period.apply(dat, endpoints(dat, "minutes", 3), mean))
#                          UA       UB       UC
#2014-04-13 00:59:57 209.1605 226.4110 213.7115
#2014-04-13 01:02:57 215.4467 226.7065 211.3325
#2014-04-13 01:05:57 216.6252 225.4948 214.1290
#2014-04-13 01:07:45 218.4633 219.5589 214.1325

The second argument to period.apply is a vector of the row numbers of the end of each 3 minute period. endpoints(dat, "minutes", 3) calculates that for you.

If you want the timestamps to be "rounded" instead of being the last timestamp of each period, you can use align.time , but align.time requires that the object is an xts , so you'd have to convert to xts first.

xx <- as.xts(x)
align.time(xx, n=60*3)
#                          UA       UB       UC
#2014-04-13 01:00:00 209.1605 226.4110 213.7115
#2014-04-13 01:03:00 215.4467 226.7065 211.3325
#2014-04-13 01:06:00 216.6252 225.4948 214.1290
#2014-04-13 01:09:00 218.4633 219.5589 214.1325

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM