R中POSIXct时间序列转data.frame时时区信息丢失问题
关于POSIXct时区标识(CET/CEST)及转换data.frame时保留显示的问题
先搞懂CET/CEST是什么
CET(Central European Time)是中欧标准时间,对应UTC+1时区;CEST(Central European Summer Time)是中欧夏令时,对应UTC+2时区。欧洲地区每年会在夏令时时段(通常是3月底到10月底)切换到CEST,你选的2018-10-01还在夏令时范围内,所以时间显示的是CEST。
为什么转成data.frame后看不到时区标识?
你发现转成data.frame后时区后缀消失了,其实并不是时区属性真的丢失了——POSIXct类型的时间数据在转成data.frame时,时区属性是被保留的,只是data.frame默认的打印逻辑不会主动输出时区标识而已。
你可以用以下代码验证:
str(mydf$myvector) # 或者直接查看属性 attr(mydf$myvector, "tzone")
会看到输出里依然能找到时区信息,只是默认打印表格时没显示出来。
两种方法保留时区显示
根据你的需求,分两种场景处理:
场景1:只想把带时区的文本存入data.frame(纯字符串格式)
如果不需要后续做时间运算,只是要显示带CET/CEST的文本,直接用strftime把POSIXct转成格式化字符串再构建data.frame即可:
myvector <- seq(as.POSIXct("2018-10-01"), as.POSIXct("2018-10-02"), "hour") # %Z参数会自动输出时区缩写(CET/CEST) mydf <- data.frame(myvector = strftime(myvector, "%Y-%m-%d %H:%M:%S %Z")) head(mydf)
这样输出的表格就会和你之前打印向量的结果一致,带有CEST后缀。
场景2:保留POSIXct时间类型(方便后续运算)同时显示时区
如果还要保留时间类型做后续的时间操作,只是打印时想看时区,可以这样处理:
- 单独打印列时,调用POSIXct的打印方法并指定时区:
print(mydf$myvector, tz = attr(myvector, "tzone"))
- 要是想整个data.frame打印都显示时区,推荐用
tibble(dplyr包中的表格类型),它对时间类型的显示更友好:
library(dplyr) mydf <- as.data.frame(myvector) # 转成tibble查看 as_tibble(mydf)
你之前尝试的attr(mydf$myvector, "tzone") <- attr(myvector, "tzone")其实是多余的,因为转data.frame时时区属性已经被保留了,只是默认打印没显示出来而已。
内容的提问来源于stack exchange,提问作者alvaropr
相关产品推荐
相关产品推荐

