我发现了一种令人意外的行为。以下R代码返回NAs而不是'2010-10-17 08:00:00':
library(lubridate);
as.POSIXct("2010-10-17 07:59:01") + seconds(59);
as.POSIXct("2010-10-17 07:59:30") + seconds(30);下面的代码片段返回预期值(‘2010-10-1707:59:00’):
as.POSIXct("2010-10-17 07:58:01") + seconds(59);
as.POSIXct("2010-10-17 07:58:30") + seconds(30);这是润滑油中的一个bug,还是我只需要更彻底地RTFM?!:)
更新:二手软件: Gnu v3.0.2,lubridate 1.3.3
更新2:使用d秒而不是秒解决了这个问题。
正确的结果是通过以下方法计算的:
as.POSIXct("2010-10-17 07:58:01") + dseconds(59);
as.POSIXct("2010-10-17 07:58:30") + dseconds(30);发布于 2014-03-04 15:16:59
最终编辑:已知错误:https://github.com/hadley/lubridate/issues/188
我发现了这个错误:很明显,POSIXct-class对象将允许您修改它的seconds部分,但是没有“进位”函数,所以如果强制总秒超过59秒,它就放弃了。
Rgames> as.POSIXct("2010-10-17 07:59:30")->dfoo
Rgames> dfoo
[1] "2010-10-17 07:59:30 EDT"
Rgames> second(dfoo)
[1] 30
Rgames> second(dfoo)<-second(dfoo)+10
Rgames> dfoo
[1] "2010-10-17 07:59:40 EDT"
Rgames> second(dfoo)<-second(dfoo)+seconds(10)
Rgames> dfoo
[1] "2010-10-17 07:59:50 EDT"
Rgames> second(dfoo)<-second(dfoo)+seconds(10)
Rgames> dfoo
[1] NA我不知道lubridate::seconds和second函数的意图是什么,但很明显,这并不是要走的路。
编辑:我一直在玩,和上面的dfoo和dbar <- as.POSIXct("2010-10-17 07:59:30",tz='GMT')一样。我可以将任意秒添加到dbar w/o问题中。此外,我还使用with_tz来切换dfoo和dbar的时区,并且不管分配的区域是什么,都可以成功地添加任意秒。这让我想知道修改后的as.POSIXct如何处理默认的tz=''参数!
编辑2:嘿,看:
Rgames> as.POSIXct("2010-10-17 07:59:30")->dfoo
Rgames> dfoo + seconds(55)
[1] "2010-10-17 08:00:25 EDT"
Rgames> dfoo + seconds(30)
[1] NA
Rgames> dfoo + seconds(31)
[1] "2010-10-17 08:00:01 EDT"
Rgames> dfoo + seconds(29)
[1] "2010-10-17 07:59:59 EDT"https://stackoverflow.com/questions/22175316
复制相似问题