R lubridate使用问题:如何将lubridate时间戳存入dataframe且不转为秒数
问题原因
通过matrix预分配生成的dataframe,所有列默认是数值类型,赋值POSIXct格式的lubridate时间对象时,会自动剥离时间类属性,保留底层的Unix时间戳数值,就会出现你看到的数字格式。
正确实现方法
方法1:初始化时直接指定列类型(最推荐)
放弃通过matrix预分配的逻辑,直接构造带时间类型列的dataframe:
library(lubridate) tsta <- ymd_hms('2021-03-16 22:59:59') # 直接初始化指定timestamp列为POSIXct类型 df <- data.frame( timestamp = as.POSIXct(rep(NA, 2), tz = "UTC"), stringsAsFactors = FALSE ) df[1, 'timestamp'] <- tsta
运行后查看df即可得到预期的时间格式:
timestamp 1 2021-03-16 22:59:59 2 <NA>
方法2:预分配后修改列类型再赋值
如果必须保留现有预分配逻辑,先把timestamp列的类型转为POSIXct再赋值即可:
library(lubridate) tsta <- ymd_hms('2021-03-16 22:59:59') df <- as.data.frame(matrix(ncol=1, nrow=2)) colnames(df) <- 'timestamp' # 先转换列类型,注意要和lubridate生成的时间时区保持一致 df$timestamp <- as.POSIXct(df$timestamp, origin = "1970-01-01", tz = "UTC") df[1, 'timestamp'] <- tsta
方法3:使用tibble存储(tidyverse生态更友好)
如果常用tidyverse工具链,tibble对时间类型的适配更友好,不需要额外处理属性兼容问题:
library(lubridate) library(tibble) tsta <- ymd_hms('2021-03-16 22:59:59') # 初始化tibble指定列类型 df <- tibble( timestamp = as.POSIXct(rep(NA, 2), tz = "UTC") ) df[1, 'timestamp'] <- tsta
内容的提问来源于stack exchange,提问作者francoiskroll
相关产品推荐
相关产品推荐

