Pandas中Timestamp与纳秒级Timedelta相加结果异常问题
你遇到的现象本质是浮点数精度误差和pandas对Timedelta浮点输入的取整规则共同导致的,具体逻辑如下:
1. 基础前提
pd.Timestamp(1)传入整数参数时,默认以纳秒为单位解析为Unix时间,对应值就是1970-01-01 00:00:00.000000001,内部存储的纳秒计数为1。- pandas的
Timedelta内部统一以64位整数存储纳秒计数,所有输入的非纳秒单位值都会先转换为纳秒整数后再参与运算。
2. 浮点数精度误差的影响
你给seconds、microseconds参数传入的1e-9、1e-3都是十进制浮点数,而Python默认的双精度浮点数是二进制存储,这两个值都无法被精确表示:
1e-9秒理论上等于1纳秒,但实际双精度存储的1e-9略小于真实值,乘以1e9转纳秒后得到的结果约为0.9999999999999999,不足1纳秒。1e-3微秒理论上等于1纳秒,同理1e-3的二进制浮点表示略小于真实值,乘以1000转纳秒后同样不足1纳秒。1e-6秒理论上等于1000纳秒,这个值的浮点误差非常小,乘以1e9转纳秒后结果非常接近1000,不存在不足1的问题。
3. pandas的取整规则
pandas将浮点输入转换为纳秒整数时,会采用向零截断的逻辑,不足1纳秒的部分会被直接丢弃:
pd.Timedelta(seconds=1e-9)实际转换后的纳秒计数为0,和原时间戳相加后自然还是原值0.000000001,和你预期的加1纳秒不符。pd.Timedelta(microseconds=1e-3)实际转换后的纳秒计数也为0,相加后同样无变化。pd.Timedelta(nanoseconds=1)传入的是整数,不存在精度损失,转换后纳秒计数为1,相加后得到0.000000002,符合预期。pd.Timedelta(seconds=1e-6)转换后的纳秒计数为1000,相加后得到1+1000=1001纳秒,对应0.000001001,和示例结果一致。
你可以通过打印Timedelta的value属性验证上述结论,该属性会返回内部存储的纳秒整数值:
print(pd.Timedelta(seconds=1e-9).value) # 输出0 print(pd.Timedelta(microseconds=1e-3).value) # 输出0 print(pd.Timedelta(nanoseconds=1).value) # 输出1 print(pd.Timedelta(seconds=1e-6).value) # 输出1000
内容的提问来源于stack exchange,提问作者deponovo
相关产品推荐
相关产品推荐

