R中的时区问题

时间:2016-06-09 04:26:32

标签: r timezone time-series

我有一个时间序列对象dat

dat <- structure(list(timestamp = c("2015-07-01T00:00:06+05:30", "2015-07-01T00:00:36+05:30", 
"2015-07-01T00:01:06+05:30", "2015-07-01T00:01:36+05:30", "2015-07-01T00:02:06+05:30", 
"2015-07-01T00:02:37+05:30"), value = c(110535.421875, 110516.6484375, 
110398.25, 110381.5703125, 110392.15625, 110471.609375)), .Names = c("timestamp", 
"value"), row.names = c(NA, 6L), class = "data.frame")

此对象与05:30的时区偏移相关联,该时区偏移为“Asia / Kolkata”。每当我尝试转换时间戳时,我都面临以下问题:

  1. as.POSIXct(strptime(dat$timestamp,format ="%Y-%m-%dT%H:%M:%S%z"))一起输出空字符串
  2. 如果我删除strptime()中的时区信息,它会自动转换为系统的时区,即as.POSIXct(strptime(dat$timestamp,format ="%Y-%m-%dT%H:%M:%S"))。换句话说,它需要系统的时区。
  3. 我应该如何始终强制时区与原始数据对象相关联?

2 个答案:

答案 0 :(得分:1)

格式%z可用于输入或输出:它是一个字符串,通常加或减,后跟两位数小时,两位数分钟。因此,您需要先清理数据,将+05:30更改为+0530。

strptime(gsub("05:30", "0530",dat$timestamp), format="%Y-%m-%dT%H:%M:%S%z")

如果它可以包含数据中的一系列时区,假设数据始终采用标准格式,则可以执行此操作以从dat$timestamp中删除最后一个分号:

strptime(gsub("(.*)\\:(.*)", "\\1\\2", dat$timestamp), "%Y-%m-%dT%H:%M:%S%z")

答案 1 :(得分:0)

lubridate是你的朋友。它的编写是因为处理日期和时间的基本R功能已经完成,但令人厌烦且无情。 lubridate(相对)容易,灵活,并且对格式,令牌等方面的微小差异非常宽容。

install.packages("lubridate")
require(lubridate)
# the "z!*" will correctly parse any of these:
# "+0530", "+5:30", "+05:30"
dat$parsedTime <- parse_date_time(dat$timestamp, orders="ymd hms z!*")
#
# now print that
#
dat

format(dat$parsedTime, tz="Asia/Kolkata")

在内部,POSIXct对象在Unix时间(https://en.wikipedia.org/wiki/Unix_time)中以数字形式表示,它没有自己的时区,因此您可以在打印时指定所需的时区。默认情况下,它通常显示在R计算机的时区中,但可以通过设置tzone属性来更改默认显示的时区,如下所示:

 attr(dat$parsedTime, "tzone") <- "Asia/Kolkata"

干杯

杰森