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"
Reasonably Related 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