R:rubridate返回NA -uneexpectedly

时间:2014-03-04 14:55:22

标签: r lubridate

我发现了一个相当意外的行为。 以下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-17 07:59:00'):

as.POSIXct("2010-10-17 07:58:01") + seconds(59);
as.POSIXct("2010-10-17 07:58:30") + seconds(30);

这是一个在lubridate中的错误还是我只需要更彻底的RTFM?! :)

更新:使用过的软件:Gnu R v 3.0.2,lubridate 1.3.3

更新2 :使用 dseconds 代替解决了这个问题。

正确的结果由:

计算
as.POSIXct("2010-10-17 07:58:01") + dseconds(59);
as.POSIXct("2010-10-17 07:58:30") + dseconds(30);

1 个答案:

答案 0 :(得分:2)

最终编辑:已知错误:https://github.com/hadley/lubridate/issues/188

我发现了错误,因为它显然是POSIXct - 类对象允许你修改它的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::secondssecond函数的用途是什么,但显然这不是要走的路:-(。

编辑:我一直在玩,dfoo如上所述dbar <- as.POSIXct("2010-10-17 07:59:30",tz='GMT')。我可以在dbar w / o问题上添加任意秒数。此外,我使用with_tz来切换dfoodbar的时区,无论分配的区域如何,都可以成功添加任意秒数。 这让我想知道[编辑] 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"