我发现了一个相当意外的行为。 以下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);
答案 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::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"