为什么as.POSIXct无法将12:00 AM正确解析为00:00:00?
问题成因
- 该现象并非
as.POSIXct解析错误,而是R对POSIXct类型的默认打印规则导致的:12:00 AM对应的是当日零点整00:00:00,当POSIXct对象的时间恰好为零点时,R控制台默认会省略时分秒部分,仅展示日期与时区。 - 解析结果的内部存储实际包含完整的时间信息,可通过
format()函数验证:
format(as.POSIXct('12:00 AM',format='%I:%M %p'), '%Y-%m-%d %H:%M:%S') # 输出:"2021-10-31 00:00:00"
运行时间差计算也可以验证解析正确性:
difftime(as.POSIXct('12:01 AM',format='%I:%M %p'), as.POSIXct('12:00 AM',format='%I:%M %p')) # 输出:Time difference of 1 mins
解决方法
仅需查看时显示完整时间
对POSIXct对象调用format()函数,手动指定输出格式即可按需展示完整时间:
time_obj <- as.POSIXct('12:00 AM',format='%I:%M %p') # 指定输出格式为 年-月-日 时:分:秒 format(time_obj, '%Y-%m-%d %H:%M:%S')
不推荐修改全局打印规则,避免对其他代码逻辑产生不可预期的影响。
用于后续数据计算
无需额外处理,POSIXct类型以时间戳(1970-01-01以来的秒数)的形式存储,零点整的存储逻辑与其他时间完全一致,做时间计算、筛选等操作都不会出现信息丢失问题。
内容的提问来源于stack exchange,提问作者Hasse1987
相关产品推荐
相关产品推荐

