2017-07-02 326 views
2

我在大西洋夏令時(GMT + 4)有一個日期時間列,並希望使用下面的代碼轉換爲UTC,但我無法找到正確的時區以獲取代碼工作(它不承認ADT或GMT + 4)。請有人幫忙,因爲我正在圍繞圈子,tzone的幫助頁面沒有提供解決方案。如何將GMT + 4時區轉換爲UTC

實施例的數據:

> dput(df) 
structure(list(Date = c("05/04/17", "05/04/17", "05/04/17", "05/04/17", 
"05/04/17", "05/04/17", "05/04/17"), Time = c(" 12:10:26", " 12:11:01", 
" 12:11:38", " 12:12:13", " 12:12:48", " 12:13:24", " 12:13:58" 
)), .Names = c("Date", "Time"), class = "data.frame", row.names = c(NA, 
-7L)) 

> df 
     Date  Time 
1 05/04/17 12:10:26 
2 05/04/17 12:11:01 
3 05/04/17 12:11:38 
4 05/04/17 12:12:13 
5 05/04/17 12:12:48 
6 05/04/17 12:13:24 
7 05/04/17 12:13:58 

#Change system time to Atlantic Daylight Time (GMT+4) 
    Sys.setenv(TZ = "ADT") 
    Sys.time() 

#Combine date and time columns and convert into POSIXct object 
    df$datetime_ADT = paste(df$Date,df$Time) 
    df$datetime_ADT = dmy_hms(df$datetime_ADT) 
    str(df$datetime_ADT) 

    #create new column for UTC datetimes 
    df$datetime_utc = df$datetime_ADT 
    #transform ADT time into UTC time 
    attr(df$datetime_utc, "tzone") = "UTC" 
    #check timezone change worked! 
    df$datetime_utc[1] 
    df$datetime_ADT[1] 

    #change system timezone back to default 
    Sys.setenv(TZ = "") 
+0

'as.POSIXct(PA ste(df $ Date,df $ Time,'+0400'),format ='%d /%m /%y%T%z',tz ='UTC')' – alistaire

+0

我找不到ADT,它是UTC plus 4.這對我來說似乎更加準確,但我可能完全錯誤了'df [,DateTime:= mdy_hms(paste0(Date,Time),tz ='Canada/Atlantic')%>%with_tz(「UTC」)] '。我使用'lubridate'和'data.table'和'dplyr' –

回答

1

AST實際上是UTC-4,和ADT是UTC-3(Wikipedia)。如果您想直接轉換,你可以指定一個在時間閱讀時的偏移,並設置時區爲UTC:更有力

as.POSIXct(paste(df$Date, df$Time, '-0300'), format = '%d/%m/%y %T %z', tz = 'UTC') 
#> [1] "2017-04-05 15:10:26 UTC" "2017-04-05 15:11:01 UTC" 
#> [3] "2017-04-05 15:11:38 UTC" "2017-04-05 15:12:13 UTC" 
#> [5] "2017-04-05 15:12:48 UTC" "2017-04-05 15:13:24 UTC" 
#> [7] "2017-04-05 15:13:58 UTC" 

或者,在ADT從OlsonNames()挑一個地方,設置屬性:

x <- as.POSIXct(paste(df$Date, df$Time), format = '%d/%m/%y %T', tz = 'America/Halifax') 
attr(x, 'tzone') <- 'UTC' 
x 
#> [1] "2017-04-05 15:10:26 UTC" "2017-04-05 15:11:01 UTC" 
#> [3] "2017-04-05 15:11:38 UTC" "2017-04-05 15:12:13 UTC" 
#> [5] "2017-04-05 15:12:48 UTC" "2017-04-05 15:13:24 UTC" 
#> [7] "2017-04-05 15:13:58 UTC" 

或與lubridate dplyr,

library(dplyr) 
library(lubridate) 

df %>% transmute(datetime = dmy_hms(paste(Date, Time), tz = 'America/Halifax'), 
       datetime = with_tz(datetime, 'UTC')) 
#>    datetime 
#> 1 2017-04-05 15:10:26 
#> 2 2017-04-05 15:11:01 
#> 3 2017-04-05 15:11:38 
#> 4 2017-04-05 15:12:13 
#> 5 2017-04-05 15:12:48 
#> 6 2017-04-05 15:13:24 
#> 7 2017-04-05 15:13:58