2015-05-05 123 views
4

在R包lubridate,我很容易創建日期使用以下語法:添加lubridate日期,以矢量改變時區,因此日期

> mdy("5/4/2015") 

正如預期的那樣,它會產生以下結果:

[1] "2015-05-04 UTC" 

但是,如果我試圖在很值添加到一個數組,它似乎從UTC更改爲我的本地時間(EDT):

> c(mdy("5/4/2015")) 
[1] "2015-05-03 20:00:00 EDT" 

因爲我不關心倍這不會影響我很多,除了這導致日期由1移回,具體如下:

> day(mdy("5/4/2015")) 
[1] 4 
> day(c(mdy("5/4/2015"))) 
[1] 3 

對我來說,增加一些對數組的行爲不應該改變那個東西的價值。我在這裏錯過了什麼,有沒有辦法解決這個問題?

+0

嘗試'Sys.setenv(TZ =「UTC」)' –

+0

謝謝;似乎可以解決症狀,我很欣賞這一點,但對於我在矢量中放置的值可能不是我從矢量中拉出的值的想法,我仍然感到不舒服。我不確定是否有一些基本的東西,我誤解了R的工作方式,或者這是一些偏袒的怪癖。 –

回答

3

這是因爲lubridate::mdy假設爲UTC。當它環繞c(),它將恢復爲本地時區EDT因爲c()不傳之timezone屬性:

> attr(mdy("5/4/2015", tz = "EDT"), "tzone") 
# [1] "EDT" 
> attr(c(mdy("5/4/2015", tz = "EDT")), "tzone") 
# NULL 

你可以這樣做:

Sys.setenv(TZ = "UTC") 

要在本地時區設置爲UTC

或者,你可以明確地specity時區中mdy()

mdy("5/4/2015", tz = "UTC") 
+1

我想我仍然感到困惑,至於這可能是重要的。從我的角度來看,如果我在數組中放入一個值並立即向數組請求數值,那麼它們最好是相同的。這種類型的東西在R中很常見? –

1

除了史蒂芬的解決方案,你也可以在你的日期存放在一個列表

list(mdy("5/4/2015"))[[1]] 
#[1] "2015-05-04 UTC" 

這將不會刪除時區而且您不必亂用環境變量。 我同意你的看法:如果你將c看作「矢量」的某種形式的構造函數,並且你來自於C++或類似的背景,那麼刪除屬性(名稱除外)肯定會很奇怪。