2

我正在尝试使用 RODBC 将一些数据从 Sql Server 2008 导入 R:

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")

数据存储在“日期时间”类型的列中。所有时间戳都是 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 将我的本地时区分配给所有时间戳。

有什么方法可以指定数据的时区,所以时区信息是正确的?

4

2 回答 2

6

之后可能最容易更改时区。

library(lubridate)
tz(results) <- "UTC"
于 2011-09-20T12:21:56.580 回答
4

Pre R 3.1.0,以及最初编写此答案的时间:

对于 class 的对象,可以在导入数据后直接POSIXlt修改变量的属性:tzone

attr(results$timestamp,"tzone") <- "UTC"

如果您的数据属于类,这将通过时区偏移量更改数据,因此通过包装POSIXct转换为first :POSIXltas.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"

于 2011-09-20T12:32:08.607 回答