2015-02-05 69 views
2

我使用library(lubridate)中的parse_date_time函數將時間序列引入R,並將其作爲EST帶入。轉換時間序列內的時區

streamflowDateTime<-parse_date_time(streamflowDateTime,"%m%d%Y %H%M",tz="EST") 

但是,數據在04-03-2005 01:45經歷了DST,下一個時間步是03:00。我想通過減去一個小時來將這個事件和所有時間戳轉換爲EST,以便它是連續的。如果有一種自動化的方式來執行此操作,那麼程序會計算出DST開始發生的位置並自動返回一個小時,因爲DST不會在同一天每一天同時生效。

這裏的數據樣本

structure(c(1112475600, 1112476500, 1112477400, 1112478300, 1112479200, 
1112480100, 1112481000, 1112481900, 1112482800, 1112483700, 1112484600, 
1112485500, 1112486400, 1112487300, 1112488200, 1112489100, 1112490000, 
1112490900, 1112491800, 1112492700, 1112493600, 1112494500, 1112495400, 
1112496300, 1112497200, 1112498100, 1112499000, 1112499900, 1112500800, 
1112501700, 1112502600, 1112503500, 1112504400, 1112505300, 1112506200, 
1112507100, 1112508000, 1112508900, 1112509800, 1112510700, 1112515200, 
1112516100, 1112517000, 1112517900, 1112518800, 1112519700, 1112520600, 
1112521500, 1112522400, 1112523300, 1112524200, 1112525100, 1112526000, 
1112526900, 1112527800, 1112528700, 1112529600, 1112530500, 1112531400, 
1112532300, 1112533200, 1112534100, 1112535000, 1112535900, 1112536800, 
1112537700, 1112538600, 1112539500, 1112540400, 1112541300, 1112542200, 
1112543100, 1112544000, 1112544900, 1112545800, 1112546700, 1112547600, 
1112548500, 1112549400, 1112550300, 1112551200, 1112552100, 1112553000, 
1112553900, 1112554800, 1112555700, 1112556600, 1112557500, 1112558400, 
1112559300, 1112560200, 1112561100, 1112562000, 1112562900, 1112563800, 
1112564700, 1112565600, 1112566500, 1112567400, 1112568300, 1112569200 
), class = c("POSIXct", "POSIXt"), tzone = "EST") 

編輯:

streamflowDateTime[8840:length(streamflowDateTime)] <- streamflowDateTime[8840:length(streamflowDateTime)]-hours(1) 

在全整個數據集,的發生發生在位置8840,這是我手工知道,我想要的代碼自動找到兩個連續時間戳之間的時間差不是15分鐘的位置,並用該自動值替換代碼中的'8840'。 for循環太慢

+0

你可以發佈你的原始輸入'streamflowDateTime'(之前調用'parse_Date_time')嗎? – nrussell 2015-02-05 17:05:36

+0

這是一個長度爲35034個元素的數據集我不知道如何在這裏發佈 – Saadat 2015-02-05 18:46:31

+0

另外,我閱讀了之前發佈的解決方案。它不工作,因爲它將整個數據集轉換爲EST。基本上,如果我將數據作爲EDT帶入數據庫,然後找到DST開始發生的位置,並將所有數據從該點向前轉換爲EST,我認爲這會有所幫助! – Saadat 2015-02-05 18:48:38

回答

1

您可能只提供完整的IANA時區ID America/New_York而不是時區縮寫。

parse_date_time(streamflowDateTime,"%m%d%Y %H%M",tz="America/New_York") 

使用America/New_York將正確地考慮這兩個EST和EDT,包括它們之間的正確轉換。

這似乎是受支持的,如in this blog post-至少在提供IANA/Olson時區的系統上,如Linux或Mac。

根據the docs

... R不拿出一個預定義的列表區域名稱,而是依賴於用戶的操作系統來解釋時區名稱。因此,有些名字會在某些計算機上被識別,但不會被其他名字識別。但是,大多數電腦會識別Arthur Olson最初編制的時區數據庫中的名稱。這些名稱通常採用「國家/城市」的形式。 ...

由於Windows使用自己的一組時區,您可能無法使用IANA/Olson標識符。但是:

  • 等效的Windows時區ID將爲"Eastern Standard Time"。 (儘管名稱包含EST和EDT)。我不確定R是否支持這些。

  • 當前規則的標準POSIX時區爲"EST5EDT,M3.2.0,M11.1.0"。這應該適用於所有操作系統 - 但它只代表自2007年更改以來的美國東部時區。

    • 從1987年到2006年的規則應該是"EST5EDT,M4.1.0,M10.5.0"。針對您所使用的值使用適當的規則。如果您的日期跨越了這些時間段,則需要將它們分開並分別處理它們,或者如果可能的話,編寫函數以使用數據的正確規則。

又見,the timezone tag wiki

+0

當我嘗試這樣做時,所有的值都轉換爲NA,並且控制檯顯示「Warning in view 所有格式都無法解析。沒有格式找到「 – Saadat 2015-02-06 15:03:12

+0

你在什麼操作系統上運行? – 2015-02-06 16:08:02

+0

Windows 7 Ultimate – Saadat 2015-02-06 16:09:37