如何将POSIXct格式时间戳转换为日期?
问题描述
我的Excel导出的POSIXct时间戳数据如下:
final_sample <- data.frame( PN_number = c( "PN101", "PN102", "PN103", "PN104", "PN105"), Maturity_date_2018 = c(1518048000, 1516665600, 1518134400, 1518048000, 1520812800), Maturity_date_2019 = c("NULL", 1516665600, "NULL", 1518048000, "NULL"), Maturity_date_2020 = c(1518048000, "NULL", "NULL", "NULL", 1520812800) )
我需要把这些时间戳转换为日期格式,尝试了以下代码但结果不准确,还用Excel公式DATE(1970,1,1) + (cell/86400)手动验证过:
final_sample_all <- final_sample %>% mutate(across(starts_with("Maturity_date_"), ~ifelse(!is.na(as.numeric(.)), as.Date(as.POSIXct(as.numeric(.), origin = "1970-01-01", tz = "UTC"), origin = "1970-01-01"), "NULL")))
问题分析与解决
你的代码存在两个关键问题:
- 数据中的
"NULL"是字符串类型,不是R原生的NA,导致类型判断和转换混乱; - 转换逻辑冗余,
as.Date(as.POSIXct(...))属于多余操作,直接用as.Date()处理数值型时间戳即可。
修正后的代码
library(dplyr) final_sample <- data.frame( PN_number = c( "PN101", "PN102", "PN103", "PN104", "PN105"), Maturity_date_2018 = c(1518048000, 1516665600, 1518134400, 1518048000, 1520812800), Maturity_date_2019 = c("NULL", 1516665600, "NULL", 1518048000, "NULL"), Maturity_date_2020 = c(1518048000, "NULL", "NULL", "NULL", 1520812800) ) final_sample_all <- final_sample %>% # 把字符串"NULL"替换为R的NA mutate(across(starts_with("Maturity_date_"), ~ifelse(. == "NULL", NA, .))) %>% # 将数值型时间戳转成日期格式 mutate(across(starts_with("Maturity_date_"), ~as.Date(as.numeric(.), origin = "1970-01-01"))) print(final_sample_all)
结果验证
转换后的日期和Excel公式计算结果完全匹配:
- 时间戳1518048000 → 2018-02-08
- 时间戳1516665600 → 2018-01-23
- 时间戳1518134400 → 2018-02-09
- 时间戳1520812800 → 2018-03-12
内容的提问来源于stack exchange,提问作者Yhan
相关产品推荐
相关产品推荐

