Dear all,
I was using stats::time to obtain the year as a floor of it, and encountered a problem: due to a rounding error (most likely due to its reliance on the base::seq.int internally, but correct me if I am wrong), the actual number corresponding to the beginning of a year X can still be (X-1).9999999..., resulting in the following undesirable behaviour. One of the simplest ways of getting the year from a ts object is floor(time(...)). However, if the starting time cannot be represented nicely as a power of 2, then, supposedly integer time does not have a .000000... mantissa: x <- ts(2:252, start = c(2002, 2), freq = 12) d <- seq.Date(as.Date("2002-02-01"), to = as.Date("2022-12-01"), by = "month") true.year <- rep(2002:2022, each = 12)[-1] wrong.year <- floor(as.numeric(time(x))) tail(cbind(as.character(d), true.year, wrong.year), 15) # Look at 2022-01-01 print(as.numeric(time(x))[240], 20) # 2021.9999999999997726, the floor of which is 2021 Yes, I have read the 'R inferno' book and know the famous '0.3 != 0.7 - 0.4' example, but I believe that the expected / intended behaviour would be actually returning round years for the first observation in a year. This could be achieved by rounding the near-integer time to integers. Since users working with dates are expecting to get exact integer years for the first cycle of a ts, this should be changed. Thank you in advance for considering a fix. Yours sincerely, Andreï V. Kostyrka [[alternative HTML version deleted]] ______________________________________________ R-help@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.