Martin Maechler
2024-Feb-08 14:15 UTC
[Rd] round.Date and trunc.Date not working / implemented
>>>>> 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">
Olivier Benz
2024-Feb-08 14:36 UTC
[Rd] round.Date and trunc.Date not working / implemented
> On 8 Feb 2024, at 15:15, Martin Maechler <maechler at stat.math.ethz.ch> 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" >> >Maybe he meant r$> Sys.time() |> round.POSIXt("years") [1] "2024-01-01 CET" r$> Sys.Date() |> round.POSIXt("years") [1] "2024-01-01 UTC" The only difference is the timezone> ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel
Jiří Moravec
2024-Feb-08 21:54 UTC
[Rd] round.Date and trunc.Date not working / implemented
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"
Possibly Parallel Threads
- round.Date and trunc.Date not working / implemented
- round.Date and trunc.Date not working / implemented
- round.Date and trunc.Date not working / implemented
- round.Date and trunc.Date not working / implemented
- round.Date and trunc.Date not working / implemented