You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:36:00