未知时区时间序列:as.POSIXct与as.POSIXlt选型及时区设置
问题解答
1. as.POSIXct 还是 as.POSIXlt?
两者核心差异在于存储结构:
as.POSIXct以**数值型(从epoch开始的秒数)**存储,结构紧凑,适合在数据框、向量中操作,计算效率更高,是处理时间序列数据的首选。as.POSIXlt以列表型存储,每个时间成分(年、月、日、时等)单独保存,适合需要频繁提取单个时间字段的场景,但在数据框中使用会占用更多内存,操作效率较低。
针对你的数据框场景,优先选择 as.POSIXct。
2. 如何避免系统时区干扰?
R的POSIX类型必须关联时区,没有“未知时区”的直接选项。要避免系统时区自动附加,最安全的做法是指定一个中立时区(比如UTC),这样时间戳会以标准时间存储,不会引入系统时区的偏移或夏令时影响:
修改你的代码如下:
data <- data.frame( id = c(0, 1, 2), datetime = c("2014-02-17 12:04:42", "2014-02-18 09:29:51", "2014-02-19 17:29:10"), mood = c(4, 7, 6) ) # 指定时区为UTC data$datetime <- as.POSIXct(data$datetime, tz = "UTC") data$datetime[1] # 输出: "2014-02-17 12:04:42 UTC"
后续如果确定了数据的实际时区,可以用 lubridate 包的 with_tz() 函数(或base R的 attr())转换时区,例如:
# 假设实际时区为"America/New_York" library(lubridate) data$datetime <- with_tz(data$datetime, tz = "America/New_York")
内容的提问来源于stack exchange,提问作者Jared
相关产品推荐
相关产品推荐

