R语言as.POSIXct转换含毫秒前导零时间戳异常问题咨询
问题原因
该异常不属于as.POSIXct的已知Bug,是你使用的格式字符串不符合R的时间解析规则导致的:
- R的时间格式符中,
%S仅用于匹配整数秒,%OS用于匹配包含小数部分的完整秒值,二者不可同时用于解析秒的部分。你所写的%S.%OS相当于要求连续解析两次秒值,两次解析结果会发生冲突。 - 你观察到的有无前导零的表现差异属于巧合:当毫秒部分为
.143时,%OS解析得到的整数秒部分为0,不会覆盖之前%S解析到的10,结果看起来正常;当毫秒部分为.043时,底层解析逻辑会将043识别为整数秒43,覆盖之前解析到的10,就出现了秒值异常变为43的问题。
解决方法
将格式字符串中的%S.%OS替换为%OS即可,%OS本身可自动识别「整数秒+小数点+小数秒」的结构,不需要额外拆分书写:
time_043_millis <- "20210909-20:05:10.043" time_143_millis <- "20210909-20:05:10.143" # 修正格式后的解析 as.POSIXct(time_043_millis, format = "%Y%m%d-%H:%M:%OS") # 输出:"2021-09-09 20:05:10 AEST" as.POSIXct(time_143_millis, format = "%Y%m%d-%H:%M:%OS") # 输出:"2021-09-09 20:05:10 AEST" # 若要验证毫秒解析正确,可使用format查看毫秒位 format(as.POSIXct(time_043_millis, format = "%Y%m%d-%H:%M:%OS"), "%Y-%m-%d %H:%M:%OS3") # 输出:"2021-09-09 20:05:10.043"
如果需要POSIXct类型默认打印毫秒,可以设置全局参数:
options(digits.secs = 3)
内容的提问来源于stack exchange,提问作者sparco1500
相关产品推荐
相关产品推荐

