[Rd] round.Date and trunc.Date not working / implemented

Jiří Moravec j|r|@c@mor@vec @end|ng |rom gm@||@com
Thu Feb 8 22:54:30 CET 2024


Apologies then. I was using R version 4.1.2 (Bird Hippie) and looks like 
someone implemented a better trunc.Date version in the meantime.

# v4.1.2
 > trunc.Date
function (x, ...)
round(x - 0.4999999)
<bytecode: 0x56138c284de0>
<environment: namespace:base>

# Unstable (2024-02-07 r85873)
 > trunc.Date
function (x, units = c("secs", "mins", "hours", "days", "months",
     "years"), ...)
{
     units <- match.arg(units)
     if (units == "months" || units == "years")
         as.Date(trunc.POSIXt(x, units, ...))
     else round(x - 0.4999999)
}
<bytecode: 0x565254ea8398>
<environment: namespace:base>


And I was looking towards my first contribution. :(
Well, its on me for not checking the dev version before writing email 
and using something that is 3 years out of date.

Look like the change did not affected `round.Date`. In both versions it 
is still not accepting `units` and instead treating `Date(...)` as numeric.

Would similar treatment for `round.Date` be desirable? And perhaps 
`floor` and `ceiling` (rounding up)? I found it useful when plotting 
(although axis.Date and prettyDate did solved some issues). Although

-- Jirka


On 9/02/24 03:15, Martin Maechler wrote:
>>>>>> Jiří Moravec
>>>>>>      on Wed, 7 Feb 2024 10:23:15 +1300 writes:
>      > This is my first time working with dates, so if the answer is "Duh, work
>      > with POSIXt", please ignore it.
>
>      > Why is not `round.Date` and `trunc.Date` "implemented" for `Date`?
>
>      > Is this because `Date` is (mostly) a virtual class setup for a better
>      > inheritance or is that something that is just missing? (like
>      > `sort.data.frame`). Would R core welcome a patch?
>
>      > I decided to convert some dates to date using `as.Date` function, which
>      > converts to a plain `Date` class, because that felt natural.
>
>      > But then when trying to round to closest year, I have realized that the
>      > `round` and `trunc` for `Date` do not behave as for `POSIXt`.
>
>      > I would assume that these will have equivalent output:
>
>      > Sys.time() |> round("years") # 2024-01-01 NZDT
>
>      > Sys.Date() |> round("years") # Error in round.default(...): non-numeric
>      > argument to mathematical function
>
>
>      > Looking at the code (and reading the documentation more carefully) shows
>      > the issue, but this looks like an omission that should be patched.
>
>      > -- Jirka
>
> You are wrong:  They *are* implemented,
> both even visible since they are in the 'base' package!
>
> ==> they have help pages you can read ....
>
> Here are examples:
>
>> trunc(Sys.Date())
> [1] "2024-02-08"
>> trunc(Sys.Date(), "month")
> [1] "2024-02-01"
>> trunc(Sys.Date(), "year")
> [1] "2024-01-01"



More information about the R-devel mailing list