2013-02-22 175 views
1

我有與this question完全相反的問題。 sqldf將日期從GMT/UTC轉換爲本地時間。我如何防止這種行爲?注意:我使用lubridate包將日期字符串轉換爲POSIXct。sqldf:從GMT/UTC更改時間戳到本地時間

dates <- c("9/12/2010 0:25","9/12/2010 23:22","9/10/2010 1:55") 
foo <- data.frame(dates=mdy_hm(dates)) 

回報

   dates 
1 2010-09-12 00:25:00 
2 2010-09-12 23:22:00 
3 2010-09-10 01:55:00 

bar <- sqldf("SELECT * FROM foo") 

回報

   dates 
1 2010-09-11 19:25:00 
2 2010-09-12 18:22:00 
3 2010-09-09 20:55:00 
+1

它看起來輸出取決於您的本地。如果你使用'DF < - data.frame(dates = as.POSIXct(dates,format =「%m /%d /%Y%M),你可以請輸入你的本地人,'Sys.getlocale('LC_TIME')' – agstudy 2013-02-22 21:59:20

+0

:%H」)); sqldf(「select * from DF」)'它會工作,但我會進一步研究它。有關進一步的討論,請嘗試:http://groups.google.com/group/sqldf – 2013-02-23 01:29:55

回答

1

sqldf幫助維基就如何處理日期的例子。您需要使用as將結果轉換爲數字。然後將結果提供給processMethod以將其轉換爲所需的格式。

這裏適應你的例子。

dates <- c("9/12/2010 0:25","9/12/2010 23:22","9/10/2010 1:55") 
foo <- data.frame(dates=mdy_hm(dates)) 
processDates <- function(data, ...) { 
    ix <- grepl("_convert$", names(data)) 
    names(data)[ix] <- sub("_convert$", "", names(data)[ix]) 
    data[ix] <- lapply(data[ix], as.POSIXct, 
         origin = "1970-01-01", 
         tz='UTC') 
    data 
    } 

sqldf("select dates as newdates_convert from foo", method = processDates) 

      newdates 
1 2010-09-12 00:25:00 
2 2010-09-12 23:22:00 
3 2010-09-10 01:55:00