2 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
一個(gè)潛在的問(wèn)題是POSIXct表示不如POSIXlt表示精確,并且POSIXct表示在格式化之前轉(zhuǎn)換為POSIXlt表示。下面我們看到如果我們的字符串直接轉(zhuǎn)換為POSIXlt表示,它輸出正確。
> as.POSIXct('2011-10-11 07:49:36.3')
[1] "2011-10-11 07:49:36.2 CDT"
> as.POSIXlt('2011-10-11 07:49:36.3')
[1] "2011-10-11 07:49:36.3"
我們還可以通過(guò)查看兩種格式的二進(jìn)制表示與0.3的通常表示之間的差異來(lái)看到。
> t1 <- as.POSIXct('2011-10-11 07:49:36.3')
> as.numeric(t1 - round(unclass(t1))) - 0.3
[1] -4.768372e-08
> t2 <- as.POSIXlt('2011-10-11 07:49:36.3')
> as.numeric(t2$sec - round(unclass(t2$sec))) - 0.3
[1] -2.831069e-15
有趣的是,看起來(lái)兩個(gè)表示實(shí)際上都比0.3的通常表示要小,但是第二個(gè)表示要么足夠接近,要么截?cái)嗟姆绞脚c我想象的不同。鑒于此,我不會(huì)擔(dān)心浮點(diǎn)表示困難; 它們可能仍然會(huì)發(fā)生,但如果我們小心使用哪種表示方式,它們有望最小化。
羅伯特對(duì)圓形輸出的渴望只是輸出問(wèn)題,可以通過(guò)多種方式解決。我的建議是這樣的:
myformat.POSIXct <- function(x, digits=0) {
x2 <- round(unclass(x), digits)
attributes(x2) <- attributes(x)
x <- as.POSIXlt(x2)
x$sec <- round(x$sec, digits)
format.POSIXlt(x, paste("%Y-%m-%d %H:%M:%OS",digits,sep=""))
}
這從POSIXct輸入開(kāi)始,并首先輪到所需的數(shù)字; 然后轉(zhuǎn)換為POSIXlt并再次舍入。第一輪舍入確保當(dāng)我們處于分鐘/小時(shí)/天邊界時(shí)所有單元都適當(dāng)增加; 轉(zhuǎn)換為更精確的表示后的第二輪四舍五入。
> options(digits.secs=1)
> t1 <- as.POSIXct('2011-10-11 07:49:36.3')
> format(t1)
[1] "2011-10-11 07:49:36.2"
> myformat.POSIXct(t1,1)
[1] "2011-10-11 07:49:36.3"
> t2 <- as.POSIXct('2011-10-11 23:59:59.999')
> format(t2)
[1] "2011-10-11 23:59:59.9"
> myformat.POSIXct(t2,0)
[1] "2011-10-12 00:00:00"
> myformat.POSIXct(t2,1)
[1] "2011-10-12 00:00:00.0"
最后一個(gè):你知道標(biāo)準(zhǔn)允許最多兩個(gè)閏秒嗎?
> as.POSIXlt('2011-10-11 23:59:60.9')
[1] "2011-10-11 23:59:60.9"
好的,還有一件事。由于OP提交的錯(cuò)誤,該行為實(shí)際上在5月發(fā)生了變化(錯(cuò)誤14579); 在那之前,它確實(shí)是小數(shù)秒。不幸的是,這意味著有時(shí)它可以繞到一秒鐘是不可能的; 在錯(cuò)誤報(bào)告中,當(dāng)它應(yīng)該轉(zhuǎn)到下一分鐘時(shí),它上升到60。決定截?cái)喽皇巧崛氲囊粋€(gè)原因是它是從POSIXlt表示打印的,其中每個(gè)單元是分開(kāi)存儲(chǔ)的。因此,滾動(dòng)到下一分鐘/小時(shí)/等比僅僅簡(jiǎn)單的舍入操作更困難。要輕松舍入,有必要在POSIXct表示中進(jìn)行舍入,然后按照我的建議轉(zhuǎn)換回來(lái)。
- 2 回答
- 0 關(guān)注
- 987 瀏覽
添加回答
舉報(bào)