我有一个时间序列对象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”。每当我尝试转换时间戳时,我都面临以下问题:
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"))
。换句话说,它需要系统的时区。我应该如何始终强制时区与原始数据对象相关联?
答案 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"
干杯
杰森