R 中的时区问题



我有一个时间序列对象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 相关联,该时区偏移量为"亚洲/加尔各答"。每当我尝试转换时间戳时,我都会遇到以下问题:

  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"))。换句话说,它需要系统的时区。

我应该如何始终强制时区与原始数据对象关联的时区相同?

格式 %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")

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) 的数字表示,Unix 时间 ( )没有自己的时区,因此您可以在打印时指定所需的时区。默认情况下,它通常以 R 计算机的时区显示,但可以通过设置 tzone 属性来更改默认显示的时区,如下所示:

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

干杯

杰森

相关内容

  • 没有找到相关文章

最新更新