Hi,

Perhaps this might work for you.  It leverages findInterval() and a
simple look-up-table of times to do the grouping.  I made it return NA
when computing the mean when there are fewer than the three
observations.

Cheers,
Ben

n <- 144
x <- data.frame(
  datetime = seq(from = as.POSIXct("2018-02-01 00:00:00", tz = "UTC"),
                 by = "10 min",
                 length = n),
  vmax = sample(10:50, n, replace = TRUE)
)

lut <- seq(from = x$datetime[1],
           to = x$datetime[n],
           by = "30 min") + 1     # add one second so that 00 sorts
with 40, 50, 00
                                  # and the other grouping is 10, 20 30

x$interval <- findInterval(x$datetime, lut)
x

y <- aggregate(vmax ~ interval, data = x,
               FUN = function(x){
                 if (length(x) < 3){
                   r <- NA
                 } else {
                   r <- mean(x)
                 }
                 r
               })
y

On Sun, Dec 6, 2020 at 1:59 PM Stefano Sofia
<stefano.so...@regione.marche.it> wrote:
>
> Hi Jim.
> I studied and implemented your solution in details. The idea is great, but 
> after a sharp revision I came to the conclusion that unfortunately it des not 
> work correctly: for the "am" side (10, 20, 30 minutes) it works well because 
> the hour is exactly the same, while for the "pm" side (40, 50, 00) the 
> algorithm it doesn't because the hour related to 40 and 50 minutes is 
> different from the hour related to 00 (which is the following one). Am I 
> wrong?
> I tried to fix it keeping the easy structure of the algorithm, but with no 
> success.
>
> Any hint for that?
> Thank you for your attention and your help
>
> Stefano
>
>
>          (oo)
> --oOO--( )--OOo----------------
> Stefano Sofia PhD
> Civil Protection - Marche Region
> Meteo Section
> Snow Section
> Via del Colle Ameno 5
> 60126 Torrette di Ancona, Ancona
> Uff: 071 806 7743
> E-mail: stefano.so...@regione.marche.it
> ---Oo---------oO----------------
>
> ________________________________________
> Da: Jim Lemon [drjimle...@gmail.com]
> Inviato: giovedì 3 dicembre 2020 4.41
> A: Stefano Sofia
> Cc: r-help mailing list
> Oggetto: Re: [R] change frequency of wind data correctly
>
> Hi again,
> Didn't realize that the example didn't even span a full day.
>
> ssdf<-read.table(text="date_POSIX time_POSIX vmax
>  2018-02-01 00:00:00 27
>  2018-02-01 00:10:00 41
>  2018-02-01 00:20:00 46
>  2018-02-01 00:30:00 39
>  2018-02-01 00:40:00 34
>  2018-02-01 00:50:00 32
>  2018-02-01 01:00:00 37
>  2018-02-01 01:10:00 31
>  2018-02-01 01:20:00 26
>  2018-02-01 01:30:00 29
>  2018-02-01 01:40:00 24
>  2018-02-01 01:50:00 35",
>  header=TRUE,stringsAsFactors=FALSE)
> # extract the hour
> ssdf$hour<-
>  as.numeric(unlist(lapply(strsplit(ssdf$time_POSIX,":"),"[",1)))
> # get the time of day as seconds from the time field
> ssdf$mins<-
>  as.numeric(unlist(lapply(strsplit(ssdf$time_POSIX,":"),"[",2)))
> # create an AM/PM variable
> ssdf$ampm<-ifelse(ssdf$mins > 0 & ssdf$mins <= 30,"am","pm")
> # drop first row
> ssdf<-ssdf[-1,]
> means<-aggregate(vmax~hour+ampm,ssdf,mean)
>
> This does a full day. To do more, add the date_POSIX field to the
> aggregate command. If you have the date and time in one field you'll
> have to split that. That will distinguish the AM/PM means in each day
> as well as hour.
>
> Jim
>
> On Thu, Dec 3, 2020 at 2:10 PM Jim Lemon <drjimle...@gmail.com> wrote:
> >
> > Hi Stefano,
> > I read in your date-time as two separate fields for convenience. You
> > can split your single field at the space to get the same result.
> >
> > ssdf<-read.table(text="date_POSIX time_POSIX vmax
> >  2018-02-01 00:00:00 27
> >  2018-02-01 00:10:00 41
> >  2018-02-01 00:20:00 46
> >  2018-02-01 00:30:00 39
> >  2018-02-01 00:40:00 34
> >  2018-02-01 00:50:00 32",
> >  header=TRUE,stringsAsFactors=FALSE)
> > # get the time of day as seconds from the time field
> > ssdf$seconds<-as.numeric(strptime(ssdf$time_POSIX,"%H:%M:%S"))
> > # subtract whatever current date strptime guesses for the date
> > ssdf$seconds<-ssdf$seconds-min(ssdf$seconds)
> > # create an AM/PM variable
> > ssdf$ampm<-ifelse(ssdf$seconds > 0 & ssdf$seconds <= 1800,"am","pm")
> > means<-aggregate(vmax~ampm,ssdf,mean)
> >
> > Jim
> >
> > On Thu, Dec 3, 2020 at 4:55 AM Stefano Sofia
> > <stefano.so...@regione.marche.it> wrote:
> > >
> > > Dear list users,
> > > I have wind data with frequency of 10 minutes (three years data). For 
> > > simplicity let me use only max wind speed.
> > > I need to reduce the frequency to 30 minutes,  at  00 (taking the mean of 
> > > data at 40, 50 and 00 minutes) and at 30 (taking the mean of data at 10, 
> > > 20 and 30 minutes) of each hour.
> > >
> > > The simple code here reported works well, but the column "interval" 
> > > groups data forward, not backward:
> > >
> > > init_day <- as.POSIXct("2018-02-01-00-00", format="%Y-%m-%d-%H-%M", 
> > > tz="Etc/GMT-1")
> > > fin_day <- as.POSIXct("2018-02-01-02-00", format="%Y-%m-%d-%H-%M", 
> > > tz="Etc/GMT-1")
> > > mydf <- data.frame(data_POSIX=seq(init_day, fin_day, by="10 mins"))
> > > mydf$vmax <- round(rnorm(13, 35, 10))
> > > mydf$interval <- cut(mydf$data_POSIX, , breaks="30 min")
> > > means <- aggregate(vmax ~ interval, mydf, mean)
> > >
> > >     data_POSIX                  vmax  interval
> > > 1  2018-02-01 00:00:00     27     2018-02-01 00:00:00
> > > 2  2018-02-01 00:10:00     41     2018-02-01 00:00:00
> > > 3  2018-02-01 00:20:00     46     2018-02-01 00:00:00
> > > 4  2018-02-01 00:30:00     39     2018-02-01 00:30:00
> > > 5  2018-02-01 00:40:00     34     2018-02-01 00:30:00
> > > 6  2018-02-01 00:50:00     32     2018-02-01 00:30:00
> > > ...
> > >
> > > I should work with
> > >
> > >     data_POSIX                  vmax  interval
> > > 1  2018-02-01 00:00:00     27     2018-02-01 00:00:00
> > > 2  2018-02-01 00:10:00     41     2018-02-01 00:30:00
> > > 3  2018-02-01 00:20:00     46     2018-02-01 00:30:00
> > > 4  2018-02-01 00:30:00     39     2018-02-01 00:30:00
> > > 5  2018-02-01 00:40:00     34     2018-02-01 00:00:00
> > > 6  2018-02-01 00:50:00     32     2018-02-01 00:00:00
> > > ...
> > >
> > >
> > > Is there a way to modify this code to groupp data correctly? (I would 
> > > prefer using only the base package)
> > >
> > > Thank you for your help
> > > Stefano
> > >
> > >
> > >
> > >          (oo)
> > > --oOO--( )--OOo----------------
> > > Stefano Sofia PhD
> > > Civil Protection - Marche Region
> > > Meteo Section
> > > Snow Section
> > > Via del Colle Ameno 5
> > > 60126 Torrette di Ancona, Ancona
> > > Uff: 071 806 7743
> > > E-mail: stefano.so...@regione.marche.it
> > > ---Oo---------oO----------------
> > >
> > > ________________________________
> > >
> > > AVVISO IMPORTANTE: Questo messaggio di posta elettronica può contenere 
> > > informazioni confidenziali, pertanto è destinato solo a persone 
> > > autorizzate alla ricezione. I messaggi di posta elettronica per i client 
> > > di Regione Marche possono contenere informazioni confidenziali e con 
> > > privilegi legali. Se non si è il destinatario specificato, non leggere, 
> > > copiare, inoltrare o archiviare questo messaggio. Se si è ricevuto questo 
> > > messaggio per errore, inoltrarlo al mittente ed eliminarlo completamente 
> > > dal sistema del proprio computer. Ai sensi dell’art. 6 della DGR n. 
> > > 1394/2008 si segnala che, in caso di necessità ed urgenza, la risposta al 
> > > presente messaggio di posta elettronica può essere visionata da persone 
> > > estranee al destinatario.
> > > IMPORTANT NOTICE: This e-mail message is intended to be received only by 
> > > persons entitled to receive the confidential information it may contain. 
> > > E-mail messages to clients of Regione Marche may contain information that 
> > > is confidential and legally privileged. Please do not read, copy, 
> > > forward, or store this message unless you are an intended recipient of 
> > > it. If you have received this message in error, please forward it to the 
> > > sender and delete it completely from your computer system.
> > >
> > > --
> > > Questo messaggio  stato analizzato da Libra ESVA ed  risultato non 
> > > infetto.
> > > This message was scanned by Libra ESVA and is believed to be clean.
> > >
> > >
> > >         [[alternative HTML version deleted]]
> > >
> > > ______________________________________________
> > > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
> > >  
> > > https://urlsand.esvalabs.com/?u=https%3A%2F%2Fstat.ethz.ch%2Fmailman%2Flistinfo%2Fr-help&e=52342f8a&h=d46bc785&f=y&p=y
> > > PLEASE do read the posting guide  
> > > https://urlsand.esvalabs.com/?u=http%3A%2F%2Fwww.R-project.org%2Fposting-guide.html&e=52342f8a&h=9b25bfd5&f=y&p=y
> > > and provide commented, minimal, self-contained, reproducible code.
>
> --
>
> Questo messaggio  stato analizzato con Libra ESVA ed  risultato non infetto.
>
>
> ________________________________
>
> AVVISO IMPORTANTE: Questo messaggio di posta elettronica può contenere 
> informazioni confidenziali, pertanto è destinato solo a persone autorizzate 
> alla ricezione. I messaggi di posta elettronica per i client di Regione 
> Marche possono contenere informazioni confidenziali e con privilegi legali. 
> Se non si è il destinatario specificato, non leggere, copiare, inoltrare o 
> archiviare questo messaggio. Se si è ricevuto questo messaggio per errore, 
> inoltrarlo al mittente ed eliminarlo completamente dal sistema del proprio 
> computer. Ai sensi dell’art. 6 della DGR n. 1394/2008 si segnala che, in caso 
> di necessità ed urgenza, la risposta al presente messaggio di posta 
> elettronica può essere visionata da persone estranee al destinatario.
> IMPORTANT NOTICE: This e-mail message is intended to be received only by 
> persons entitled to receive the confidential information it may contain. 
> E-mail messages to clients of Regione Marche may contain information that is 
> confidential and legally privileged. Please do not read, copy, forward, or 
> store this message unless you are an intended recipient of it. If you have 
> received this message in error, please forward it to the sender and delete it 
> completely from your computer system.
>
> --
> Questo messaggio  stato analizzato da Libra ESVA ed  risultato non infetto.
> This message was scanned by Libra ESVA and is believed to be clean.
>
> ______________________________________________
> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.



-- 
Ben Tupper
Bigelow Laboratory for Ocean Science
East Boothbay, Maine
http://www.bigelow.org/
https://eco.bigelow.org

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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.

Reply via email to