将午夜时刻转POSIXct再转回文本后重新转换为何得到NA?
午夜时间转POSIXct再转回时出现NA的问题解决
当处理精确到午夜的文本日期时间(如"2023-11-16 00:00:00")时,会遇到以下问题:
- 用
as.POSIXct()将其转为POSIXct对象后,调用as.character()转回文本,会自动省略00:00:00部分,得到"2023-11-16"。 - 此时再用
%Y-%m-%d %H:%M:%S格式将该文本转回POSIXct,会返回NA而非初始的日期时间值,导致后续代码中断。
代码示例
> datetime = "2022-03-12 00:00:00" > posix = as.POSIXct(datetime, format="%Y-%m-%d %H:%M:%S",tz="Europe/Madrid") > posix [1] "2022-03-12 CET" > as.POSIXct(as.character(posix), format="%Y-%m-%d %H:%M:%S",tz="Europe/Madrid") [1] NA
一行代码复现:
> as.POSIXct(as.character(as.POSIXct(datetime, format="%Y-%m-%d %H:%M:%S",tz="Europe/Madrid")), format="%Y-%m-%d %H:%M:%S",tz="Europe/Madrid") [1] NA
解决方法
临时可以用strftime()函数强制保留完整的日期时间格式,再进行转换:
# 将POSIXct转为带完整时间的文本 > strftime(posix, format="%Y-%m-%d %H:%M:%S") [1] "2022-03-12 00:00:00" # 转回POSIXct即可得到初始值 > as.POSIXct(strftime(posix, format="%Y-%m-%d %H:%M:%S"), format="%Y-%m-%d %H:%M:%S", tz="Europe/Madrid") [1] "2022-03-12 CET"
如果需要类似as.character()的便捷调用,可以自定义一个函数来封装strftime的格式指定:
as.character.POSIXct.full <- function(x) { strftime(x, format="%Y-%m-%d %H:%M:%S") } # 使用自定义函数转换 > as.character.POSIXct.full(posix) [1] "2022-03-12 00:00:00" > as.POSIXct(as.character.POSIXct.full(posix), format="%Y-%m-%d %H:%M:%S", tz="Europe/Madrid") [1] "2022-03-12 CET"
本质原因是as.character()对POSIXct对象的输出依赖系统默认格式,午夜时分自动简化显示;而strftime()可以强制指定输出格式,避免丢失时间部分。
内容的提问来源于stack exchange,提问作者Akronix
相关产品推荐
相关产品推荐

