2

我发现了一种相当出乎意料的 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而不是seconds解决了这个问题。

正确的结果计算如下:

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

1 回答 1

2

最终编辑:已知错误: 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。此外,我曾经为和with_tz切换时区,并且无论分配的区域如何,都可以成功添加任意秒数。这让我想知道 [redacted]对默认参数做了什么! dfoodbaras.POSIXcttz=''

编辑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"
于 2014-03-04T15:16:59.547 回答