如何将带亚秒级的POSIXct类型转换为数值型以恢复原始时间戳?
嘿,这个问题确实容易踩坑!我来帮你理清最简洁的解决思路:
首先要明确一个关键事实:R中的POSIXct类型本质上是带小数的数值向量,它底层存储的就是自1970-01-01(纪元起点)以来的秒数——包括亚秒的小数部分!你之前用as.numeric(dttm)得到整数,只是R的默认打印设置隐藏了小数部分而已,并非数值本身被截断了。
最简恢复方法
要从dttm恢复原始的z(毫秒数),只需要两步:
- 提取
POSIXct的底层数值(带亚秒):用as.double(dttm)或者unclass(dttm)都可以,两者效果一致 - 转换为毫秒数并修正当初的构造偏移
对应你给出的例子,代码如下:
# 提取带亚秒的纪元秒数 secs_with_subsec <- as.double(dttm) # 转换为毫秒并减去当初加的0.1,再取整得到原始z z_recovered <- round(secs_with_subsec * 1000 - 0.1) # 验证结果 z_recovered # [1] 1579598122120
为什么之前的尝试没成功?
as.numeric(dttm):其实它返回的是带小数的数值,只是R默认打印时省略了小数部分。你可以用print(as.numeric(dttm), digits = 10)查看完整值:print(as.numeric(dttm), digits = 10) # [1] 1579598122.1201str(dttm)/unclass(dttm):unclass(dttm)其实已经给出了正确的带小数的数值,你当时可能没注意到小数部分,直接当成整数处理了。
补充说明
如果是常规的毫秒转POSIXct(没有额外加0.1的操作),那直接用round(as.double(dttm) * 1000)就能恢复原始毫秒数。另外要注意时区不影响底层数值的存储,因为POSIXct的数值是基于UTC纪元起点计算的,时区只是显示属性。
内容的提问来源于stack exchange,提问作者Anders Ellern Bilgrau
相关产品推荐
相关产品推荐

