[R] change frequency of wind data correctly

Jeff Newmiller jdnewm|| @end|ng |rom dcn@d@v|@@c@@u@
Sun Dec 6 21:55:04 CET 2020


Sigh. Don't use integer division AND ceiling.

ceiling_dtmN <- function( dtm, mins ) {
   tm_base <- as.POSIXct( trunc( min( dtm ), units = "days" ) )
   x <- as.numeric( dtm - tm_base, units = "mins" )
   xceil <- ceiling( x / mins ) * mins
   tm_base + as.difftime( xceil, units = "mins" )
}

On Sun, 6 Dec 2020, Jeff Newmiller wrote:

> I usually roll my own:
>
> -----------
> Sys.setenv( TZ = "GMT" )
> ssdf$Dtm <- with( ssdf
>                , as.POSIXct( paste( date_POSIX, time_POSIX ) )
>                )
>
> ceiling_dtmN <- function( dtm, mins ) {
>  tm_base <- as.POSIXct( trunc( min( dtm ), units = "days" ) )
>  x <- as.numeric( dtm - tm_base, units = "mins" )
>  xceil <- ceiling( x %/% mins ) * mins
>  tm_base + as.difftime( xceil, units = "mins" )
> }
>
> ssdf$Dtm30 <- ceiling_dtmN( ssdf$Dtm, mins = 30 )
> ssdf
> -----------
>
> On Sun, 6 Dec 2020, Stefano Sofia 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.sofia using regione.marche.it
>> ---Oo---------oO----------------
>> 
>> ________________________________________
>> Da: Jim Lemon [drjimlemon using 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 <drjimlemon using 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.sofia using 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.sofia using 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 using 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 using 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.
>> 
>
> ---------------------------------------------------------------------------
> Jeff Newmiller                        The     .....       .....  Go Live...
> DCN:<jdnewmil using dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live Go...
>                                      Live:   OO#.. Dead: OO#..  Playing
> Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
> /Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k
>
> ______________________________________________
> R-help using 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.
>

---------------------------------------------------------------------------
Jeff Newmiller                        The     .....       .....  Go Live...
DCN:<jdnewmil using dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live Go...
                                       Live:   OO#.. Dead: OO#..  Playing
Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
/Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k



More information about the R-help mailing list