# [R] Help with Time

David Winsemius dwinsemius at comcast.net
Sat Nov 22 01:59:53 CET 2014

```On Nov 21, 2014, at 3:19 PM, David Winsemius wrote:

>
> On Nov 21, 2014, at 2:55 PM, Raghuraman Ramachandran wrote:
>
>> Sorry I forgot to mention it clearly. I like to round it to the
>> nearest 30th minute that is past. So 12:28:59 will be again 12:00:00
>> and
>> 12:59:59 will be 12:30:00 etc. Apologies for the lack of clarity in
>> the beginning.
>>
>
> That's just truncation. Should be very easy to hack trunc.POSIXt to deliver that result. Add a "half_hr" unit to the list and then a simple extra clause that check for minutes >30.

In my first effort I used an if(){}else{} construction, committing the newbie mistake of forgetting it was not the vectoRized way. So this performs better:

trunc.POSIXt <-
function (x, units = c("secs", "mins", "half_hrs", "hours", "days"), ...)
{
units <- match.arg(units)
x <- as.POSIXlt(x)
if (length(x\$sec))
switch(units, secs = {
x\$sec <- trunc(x\$sec)
}, mins = {
x\$sec[] <- 0
}, half_hrs = {
x\$sec[] <- 0
x\$min[] <- 0L+ 30L*(x\$min >=30)
}, hours = {
x\$sec[] <- 0
x\$min[] <- 0L
}, days = {
x\$sec[] <- 0
x\$min[] <- 0L
x\$hour[] <- 0L
x\$isdst[] <- -1L
})
x
}

> time <- seq(Sys.time(), Sys.time()+60*120, by= 60*5)
> trunc(time, "half_hrs")
[1] "2014-11-21 15:30:00 PST" "2014-11-21 15:30:00 PST"
[3] "2014-11-21 15:30:00 PST" "2014-11-21 15:30:00 PST"
[5] "2014-11-21 15:30:00 PST" "2014-11-21 15:30:00 PST"
[7] "2014-11-21 16:00:00 PST" "2014-11-21 16:00:00 PST"
[9] "2014-11-21 16:00:00 PST" "2014-11-21 16:00:00 PST"
[11] "2014-11-21 16:00:00 PST" "2014-11-21 16:00:00 PST"
[13] "2014-11-21 16:30:00 PST" "2014-11-21 16:30:00 PST"
[15] "2014-11-21 16:30:00 PST" "2014-11-21 16:30:00 PST"
[17] "2014-11-21 16:30:00 PST" "2014-11-21 16:30:00 PST"
[19] "2014-11-21 17:00:00 PST" "2014-11-21 17:00:00 PST"
[21] "2014-11-21 17:00:00 PST" "2014-11-21 17:00:00 PST"
[23] "2014-11-21 17:00:00 PST" "2014-11-21 17:00:00 PST"
[25] "2014-11-21 17:30:00 PST"

> --
> David.
>
>
>> Many thanks
>> Raghu
>>
>> On Fri, Nov 21, 2014 at 10:52 PM, Raghuraman Ramachandran
>> <optionsraghu at gmail.com> wrote:
>>> Dear guRus
>>>
>>> How can I round of time in R to the nearest 30th minute please?
>>>
>>> For example suppose if
>>>> Sys.time()
>>> [1] "2014-11-21 22:49:05.59042 GMT"
>>> then I would like a function that outputs 22:30:00.
>>>
>>> if Sys.time is 12:13:22 then I would like to get 12:00:00 etc.
>>>
>>> Any help would be appreciated.
>>>
>>> Many thanks and regards,
>>> Raghu
>>
>> __________________________________

>

David Winsemius
Alameda, CA, USA

```