R语言中追加时间向量后GMT格式自动转为CST的解决方法
解决R中合并时间向量时区自动转换的问题
问题重现
你有一个时间向量a和单个时间元素b,尝试将b追加到a末尾:
a <- structure(c(1641014838, 1641018843, 1641020213, 1641027156, 1641034257, 1641034530, 1641044002, 1641051992, 1641052704, 1641061470, 1641068457, 1641069687, 1641071745, 1641073230, 1641073791), class = c("POSIXct", "POSIXt"), tzone = "GMT") b <- "2022-01-01 23:00:00 GMT" x <- c(a, b)
执行print(x)后,原本的GMT格式时间自动转换为CST格式:
[1] "2022-01-01 16:07:18 CST" "2022-01-01 16:14:03 CST" "2022-01-01 16:16:53 CST" "2022-01-01 18:12:36 CST" "2022-01-01 20:10:57 CST" "2022-01-01 20:15:30 CST" [7] "2022-01-01 22:53:12 CST" "2022-01-02 01:06:42 CST" "2022-01-02 01:18:24 CST" "2022-01-02 03:14:30 CST" "2022-01-02 05:00:57 CST" "2022-01-02 05:21:27 CST" [13] "2022-01-02 05:55:45 CST" "2022-01-02 06:20:30 CST" "2022-01-02 06:29:51 CST" "2022-01-02 07:00:00 CST"
原因分析
这个问题的核心是:
a是带GMT时区属性的POSIXct类型时间向量b是字符串类型,用c(a, b)合并时,R会自动将b转为POSIXct,但默认使用系统本地时区(此处为CST)- 合并后的向量会统一采用本地时区显示,导致所有时间被转换为CST格式展示,虽然底层时间戳是正确的,但显示不符合预期
解决方法
方法1:将b转换为同时区的POSIXct后再合并
先把b按GMT时区转为POSIXct类型,再和a合并,整个向量的时区会保持GMT:
# 将b转换为GMT时区的POSIXct b_posix <- as.POSIXct(b, tz = "GMT") # 合并向量 x <- c(a, b_posix) print(x) # 输出: # [1] "2022-01-01 08:07:18 GMT" "2022-01-01 08:14:03 GMT" "2022-01-01 08:16:53 GMT" "2022-01-01 10:12:36 GMT" "2022-01-01 12:10:57 GMT" "2022-01-01 12:15:30 GMT" # [7] "2022-01-01 14:53:12 GMT" "2022-01-01 17:06:42 GMT" "2022-01-01 17:18:24 GMT" "2022-01-01 19:14:30 GMT" "2022-01-01 21:00:57 GMT" "2022-01-01 21:21:27 GMT" #[13] "2022-01-01 21:55:45 GMT" "2022-01-01 22:20:30 GMT" "2022-01-01 22:29:51 GMT" "2022-01-01 23:00:00 GMT"
方法2:修改合并后向量的时区属性
如果已经完成合并,可以直接修改向量的tz属性,强制设置为GMT:
x <- c(a, b) # 修改时区为GMT attr(x, "tzone") <- "GMT" print(x) # 输出结果同方法1
方法3:保持字符串格式(不转换为时间类型)
如果不需要对时间做计算,仅需拼接字符串,可将a转为字符向量后再合并:
# 将a转为字符向量,保留GMT格式(手动添加后缀) a_char <- paste0(as.character(a), " GMT") # 合并字符向量 x <- c(a_char, b) print(x) # 输出: # [1] "2022-01-01 08:07:18 GMT" "2022-01-01 08:14:03 GMT" "2022-01-01 08:16:53 GMT" "2022-01-01 10:12:36 GMT" "2022-01-01 12:10:57 GMT" "2022-01-01 12:15:30 GMT" # [7] "2022-01-01 14:53:12 GMT" "2022-01-01 17:06:42 GMT" "2022-01-01 17:18:24 GMT" "2022-01-01 19:14:30 GMT" "2022-01-01 21:00:57 GMT" "2022-01-01 21:21:27 GMT" #[13] "2022-01-01 21:55:45 GMT" "2022-01-01 22:20:30 GMT" "2022-01-01 22:29:51 GMT" "2022-01-01 23:00:00 GMT"
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

