DEBUG.WIKI
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →
腾讯云;让你的想法跑起来;轻量服务器 · 建站 / Docker / API;查看产品 →
阿里云;从建站到云上业务;云服务器 · 数据库 · 对象存储;查看产品 →

pandas interval_range 用大整数,却生成了空区间

整数边界接近 2**53 时,interval_range 的浮点中间计算可能合并相邻整数。显式保留整数断点,再构造 IntervalIndex,并检查边界数量和零宽区间。

pd.interval_range(start=2**53, end=2**53 + 4, freq=1) 的输入全是整数,结果却出现左右端点相同的空区间。检查输出断点之前,不要认定是原始数据有重复边界。

这一问题在 pandas 2.2.3 中出现,3.1.0 也仍采用相关浮点中间计算:为包含结束值,代码使用 end + freq * 0.1 再生成断点。整数进入浮点运算后,靠近或超过 2**53 的相邻整数未必能分别表示;后续再转回整数,也无法找回已经合并的区别。

从整数断点直接构造

对于范围可控、正整数步长,而且结束点正好落在网格上的场景,可以明确生成整数边界:

import numpy as np
import pandas as pd

start = 2**53
end = start + 4
breaks = np.array(list(range(start, end + 1)), dtype=np.int64)
intervals = pd.IntervalIndex.from_breaks(breaks, closed="right")

这个例子只有五个断点,预期得到四个宽度为 1 的右闭区间。closed="right" 对应 (a, b],应使用业务原来的闭合约定;修复精度时不要改变边界点属于哪一段。

实际步长不是 1 时,应先确定 (end - start) 是否整除步长,以及余数部分该舍弃还是单独形成最后一段。不要机械追加 end,生成一个与原频率不同的区间。负步长或倒序边界也应按实际接口约束另行处理。

大整数与大范围是两个限制

数值超过浮点连续整数精度,并不表示它超过 int64;本例在 int64 范围内,可以保留精确整数。若真实输入超出 int64,则需另选数据表示,不能强制转换后接受溢出结果。

同时,range 覆盖的断点数量可能很大。示例中的 list(range(...)) 只适合已检查规模的小范围;先估算断点个数和内存,不能把几十亿个边界一次装入列表。需要不同数据结构时,保持原来的整数与区间语义,再设计分块或其他索引方式。

intervals.astype(...) 或给显示结果设置整数格式不会修正已丢失的边界。应从原始整数重新构造,不从错误的浮点区间反推。

验收检查区间数量、相邻左右端点、每段宽度,以及边界值的包含关系。特别覆盖 2**53 附近的相邻整数与实际使用的最大值。已经用错误区间完成的分箱或关联需要重算;只重建索引不会自动修复此前保存的类别结果。