2014-03-04 53 views
2

我發現了一個相當意外的lubridate行爲。 下述R代碼返回的NA,而不是「2010-10-17八點00分○○秒」:R:lubridate返回NA - 意外地

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 7時59分00秒」 ):

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

這是一個在lubridate中的錯誤還是我只需要RTFM更徹底?! :)

UPDATE:使用軟件:牛羚R訴3.0.2,1.3.3 lubridate

更新2:使用dseconds而不是解決了這個問題。

正確結果的計算方法是:

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

看起來它可能是一個時區和/或夏令時間的問題。 –

+0

你創建了什麼班'「2010-10-17 07:59:01」'與(作爲支票)? –

+0

@Joshua:謝謝。但是,您可以將月份更改爲任何有效值,並且行爲保持不變... – TOBx2

回答

2

最後編輯:已知的bug:https://github.com/hadley/lubridate/issues/188

我發現的bug,因爲它是:很明顯,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::secondssecond功能是什麼,我不知道,但顯然這不是去:-(方式

編輯:我一直在玩,有dfoo如上dbar <- as.POSIXct("2010-10-17 07:59:30",tz='GMT')。我可以給dbar添加任意秒的W/O問題。此外,我使用with_tz來切換dfoodbar的時區,並且不管分配了哪個區域,都可以成功地添加任意秒數 這使我想知道正是[redacted] 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" 
+0

非常感謝! (dseconds似乎是...請參閱更新2) – TOBx2

+0

不確定是否它的原因,但包描述說,它允許幾分之一秒,如果你希望他們。 –

+0

閱讀http://www.r-statistics上的文章。com/2012/03/do-more-with-dates-and-times-in-r-with-lubridate-1-1-0 /看起來像'lubridate :: seconds'是一個時期,文章暗示它是精確的目的,但'lubridate :: dseconds'被視爲一個持續時間,這是精確的設計,所以當試圖添加一個不精確的時間翻轉對象,可能是因爲不精確?文檔不清楚,但需要牢記。 –