我有一个时间序列对象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 相关联,该时区偏移量为"亚洲/加尔各答"。每当我尝试转换时间戳时,我都会遇到以下问题:
- 使用
as.POSIXct(strptime(dat$timestamp,format ="%Y-%m-%dT%H:%M:%S%z"))
,它输出空字符串 - 如果我删除
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"
干杯
杰森