我正在尝试将一些数据从Sql Server 2008导入到R中,使用RODBC:
db <- odbcDriverConnect(connection = "Driver={SQL Server Native Client 10.0};Server=server; Database=db;Trusted_Connection=yes;")
results <- sqlQuery(db, "select timestamp from table where some-restriction")
数据存储在“datetime”类型的列中。所有时间戳都是UTC,但我的系统时区是CET。 R将所有时间戳转换为“POSIXct”“POSIXt”类型的值,例如:
“2011-01-01 07:24:12 CET”
“2011-01-01 08:35:10 CET”
“2011-01-01 09:02:50 CET”
时间戳是正确的,时区错了。在我看来,由于没有明确指定时区,R将所有时间戳分配给我的本地时区。
有没有办法指定数据的时区,所以时区信息是否正确?
答案 0 :(得分:5)
之后可能最容易更改时区。
library(lubridate)
tz(results) <- "UTC"
答案 1 :(得分:4)
Pre R 3.1.0,当这个答案最初编写时:
对于类POSIXlt
的对象,您可以在导入数据后直接修改变量的tzone
属性:
attr(results$timestamp,"tzone") <- "UTC"
如果您的数据属于POSIXct
类,则会按时区偏移更改数据,因此首先通过包装POSIXlt
转换为as.POSIXlt()
:
results$timestamp <- as.POSIXlt(results$timestamp)
例如:
tm <- as.POSIXlt(Sys.time())
tm
[1] "2011-09-20 13:45:01 BST"
attr(tm,"tzone") <- "UTC"
tm
[1] "2011-09-20 13:45:01 UTC"
由于R 3.1.0,此行为已更改为使用POSIXlt对象的组件而不是属性,并且在新闻中被斜向引用:
日期时间的打印将使用时区缩写 如果知道的话,在当时使用。例如,对于1940年以前的巴黎,这可以 是LMT,PMT,WET或WEST。为了实现这一点,“POSIXlt”类有一个 可选组件“zone”记录每个元素的缩写。
现在你只需使用tm$zone <- "UTC"