>>>>> Suharto Anggono Suharto Anggono via R-devel >>>>> on Sun, 2 Oct 2022 08:42:50 +0000 (UTC) writes:
> With r82904, 'as.character.POSIXt' in R devel is changed. The NEWS item: > as.character(<POSIXt>) now behaves more in line with the > methods for atomic vectors such as numbers, and is no longer > influenced by options(). > Part of the code: > s <- trunc(x$sec) fs <- x$sec - s > r1 <- sprintf("%d-%02d-%02d", 1900 + x$year, x$mon+1L, x$mday) > if(any(n0 <- time != 0)) # add time if not 0 > r1[n0] <- paste(r1[n0], > sprintf("%02d:%02d:%02d%s", x$hour[n0], x$min[n0], s[n0], > substr(as.character(fs[n0]), 2L, 32L))) > * Wrong: > The result is wrong when as.character(fs[n0]) has scientific notation. > Example (modified from https://bugs.r-project.org/show_bug.cgi?id=9819): > op <- options(scipen = 0, OutDec = ".") # (default setting) > x <- as.POSIXlt("2007-07-27 16:11:03.000002") > as.character(x) # "2007-07-27 16:11:03.99999999983547e-06" > as.character(x$sec - trunc(x$sec)) > # "1.99999999983547e-06" options(op) > 'as.character.POSIXt' could temporarily set option 'scipen' large enough to prevent scientific notation in as.character(fs[n0]) . > * Too much precision: > In some cases with fractional seconds with seconds close to 60, the result has many decimal places while there is an accurate representation with less decimal places. It is actually OK, just unpleasant. > Example (modified from https://bugs.r-project.org/show_bug.cgi?id=14693): > op <- options(scipen = 0, OutDec = ".") # (default setting) > x <- as.POSIXlt("2011-10-01 12:34:56.3") > x$sec == 56.3 # TRUE print(x$sec, 17) > # [1] 56.299999999999997 as.character(x) > # "2011-10-01 12:34:56.299999999999997" > format(x, "%Y-%m-%d %H:%M:%OS1") # short and accurate > # "2011-10-01 12:34:56.3" ct <- as.POSIXct(x, tz = "UTC") > identical(ct, > as.POSIXct("2011-10-01 12:34:56.3", tz = "UTC")) # TRUE > print(as.numeric(ct), 17) # [1] 1317472496.3 > lct <- as.POSIXlt(ct) lct$sec == 56.3 # FALSE > print(lct$sec, 17) # [1] 56.299999952316284 > as.character(ct) # "2011-10-01 12:34:56.299999952316284" > options(op) > The "POSIXct" case is a little different because some precision is already lost after converted to "POSIXct". > In 'as.character.POSIXt', using 'as.character' on the seconds (not separating the fractional part) might be good enough, but a leading zero must be added as necessary. > * Different from 'format': > - With fractional seconds, the result is influenced by option 'OutDec'. > - From "Printing years" in ?strptime: "For years 0 to 999 most OSes pad with zeros or spaces to 4 characters, and Linux outputs just the number." > Because (1900 + x$year) is formatted with %d in 'as.character.POSIXt', years 0 to 999 is output without padding. It is different from 'format' in OSes other than Linux. > * Behavior with "improper" "POSIXlt" object: > - "POSIXlt" object with out-of-bounds components is not normalized. > Example (modified from regr.tests-1d.R): > op <- options(scipen = 0) # (default setting) > x <- structure( list(sec = 10000, min = 59L, hour = 18L, > mday = 6L, mon = 11L, year = 116L, wday = 2L, yday = 340L, > isdst = 0L, zone = "CET", gmtoff = 3600L), > class = c("POSIXlt", "POSIXt"), tzone = "CET") > as.character(x) # "2016-12-06 18:59:10000" format(x) > # "2016-12-06 21:45:40" options(op) > - With "POSIXlt" object where sec, min, hour, mday, mon, and year components are not all of the same length, recycling is not handled. > Example (modified from regr.tests-1d.R): > op <- options(scipen = 0) # (default setting) > x <- structure( > list(sec = c(1, 2), min = 59L, hour = 18L, > mday = 6L, mon = 11L, year = 116L, wday = 2L, yday = 340L, > isdst = 0L, zone = "CET", gmtoff = 3600L), > class = c("POSIXlt", "POSIXt"), tzone = "CET") > as.character(x) # c("2016-12-06 18:59:01", "NA NA:NA:02") > format(x) > # c("2016-12-06 18:59:01", "2016-12-06 18:59:02") > options(op) > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel