R:lubridate返回NA–;意外地
我发现lubridate有一种意想不到的行为。 以下R代码返回NAs而不是“2010-10-17 08:00:00”:R:lubridate返回NA–;意外地,r,lubridate,R,Lubridate,我发现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'): 这是lubridate中的一个bug还是我必须更彻底地RTFM?!:
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'):
这是lubridate中的一个bug还是我必须更彻底地RTFM?!:)
更新:使用的软件:Gnu R v 3.0.2,lubridate 1.3.3
更新2:使用数据秒而不是秒解决了此问题
通过以下公式计算正确的结果:
as.POSIXct("2010-10-17 07:58:01") + dseconds(59);
as.POSIXct("2010-10-17 07:58:30") + dseconds(30);
最终编辑:已知错误:
我发现了这个bug,因为它是这样的:显然,POSIXct
-类对象将允许您修改它的seconds
部分,但是没有“carry”函数,因此如果您强制总秒数超过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
看起来可能是时区和/或夏令时问题。您创建了什么类的
“2010-10-17 07:59:01”
(作为检查)?@Joshua:谢谢。但是你可以将月份更改为任何有效值,行为保持不变…@RScriv:我不明白你的问题。这只是一根弦…@CarlWitthoft:我试过以下方法:ymd_hms(“2010-01-17 07:59:01”)+秒(59);它还返回NA.:/不确定这是否是原因,但软件包说明中说,如果您愿意,它允许几分之一秒的时间。在这里通读这篇文章,似乎lubridate::seconds
是一个句点,这篇文章暗示它是故意的,但lubridate::dseconds
被视为一个持续时间,这在设计上是精确的,所以当试图给滚动对象添加不精确的时间时,可能是因为不精确?文件不清楚,但要记住这一点。
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
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"