换表用量断档指计量点位更换表计后,按设备号串起来的时序时间线断开,月度用量出现少算或双计。本文以某产业园区 3860 个计量点、12 个月内 31 次换表的样本,说明时序库按点位拼接时间线的建模方式,以及换表日底码冲抵与空窗补测的算法。
关键信息摘要
时间线以计量点号做主维度,设备号退为字段,换表只换读数来源,不新建时间线。点位与设备的绑定关系必须带生效区间,查历史按区间切片,不用当前绑定反查。换表日用量等于旧表拆表码减旧表上日码,加新表当日末码减装表底码,缺一步就双计。拆表时刻到新表首帧之间的空窗按时段占比补测,打质量标记,结算侧再决定是否计入。该方法仅适用于整点上报的计量点位,人工抄见与脱机预付费表不适用。
一、三种时间线建模方式的取舍
某产业园区 3860 个计量点,按电量、电压、电流、功率、需量 5 类指标采集,周期 15 分钟,日增约 37 万帧。12 个月内换表 31 次,故障换表 22 次、增容 5 次、过户更名 4 次。
表计一换,设备号就变。把设备号当主维度,时间线断成两段,旧表读数挂在旧设备上,新表从零起步,两张曲线拼不成一条。
建模方式
换表后时间线
系列数增长
设备级排查
查询写法
设备号做维度
断成两段,历史挂在旧设备
每次换表新增 5 条
直接按设备号过滤
须先查设备再猜点位
点位做维度、设备号做字段
连续,只换读数来源
不新增
回查关系表
按点位单维度过滤
点位与设备号都做维度
连续但要跨系列合并
双维度组合,索引条目变多
直接按设备号过滤
查询需合并多系列
选第二种。计量业务的查询起点是点位,账单按户出;设备级排查是低频动作,回查一张关系表就够。

这张图说明换表前后的时间线走向,旧设备段与新设备段经绑定区间归并到同一计量点。
对照可见点位时间线是连续的,断开的只是设备号这一层,读数来源在换表点完成切换。
二、关系表带区间,查询逐段下推
关系表 point_bind 四列:point_no、meter_id、bind_start、bind_end。换表时给旧行补写 bind_end,同时插一条新行,bind_start 取装表时刻,不覆盖旧行。
查历史按 t 落在区间内取设备号,不用今天的绑定关系反查。这是断档的根因:反查会让换表后的历史读数查不到,或被算到新表名下。
时序引擎不擅长大表 join。在时序表上直接与关系表 join,时间范围条件容易压到 join 之后执行,扫描量按点位全历史展开。做法是先取该点位目标时段的绑定区间,31 次换表也就 31 条记录,再逐段下推时间范围。
-- 单个绑定区间内的点位日用量,区间由关系表先取出后逐段下推
SELECT date_trunc('day', ts) AS stat_day,
SUM(energy_delta) AS kwh,
COUNT(1) AS frames
FROM meter_reading
WHERE point_no = 'A3-1204'
AND ts >= '2026-10-01 00:00:00'
AND ts < '2026-10-14 10:13:00'
GROUP BY stat_day
通用教程里查不到的细节在这里:区间切片要用左闭右开,旧行 bind_end 与新行 bind_start 同值,否则换表当刻那一帧被两段各算一次。按现场记录,31 次换表里 9 次出现过边界帧重复,单帧误差不大,按日聚合后差额被放大。
区间也不能重叠或留缝。重叠双计,留缝空窗。建议在关系表加检查:同一 point_no 的区间按 bind_start 排序后,前一条 bind_end 必须等于后一条 bind_start。
三、换表日的重叠段与空窗
换表日用量不能用末码减前日码。拆表码是旧表最后一段的累计读数,新表读数从装表底码起算,两者相加才是当日真实用量。
现场样本:A3-1204 在 10 月 14 日 10:13 换表,旧表拆表码 18642.7,前一日码 18568.3,旧表段 74.4 度;新表装表底码 87.4 度,出厂校验已走字,当日末码 129.6,新表段 42.2 度,合计 116.6 度。
拿新表末码 129.6 当当日用量,多算 13 度;拿末码减前日码得负数,被下游当异常丢掉,少算 116.6 度。两种错法在对账里都表现为差额,归因完全不同。
底码必须与装表记录一起落库,且允许非零。底码当 0 是常见错法:出厂校验、运输试挂都会走字,底码为 0 的新表反而是少数。
def point_day_kwh(rows, binds, day_start):
total, frames = 0.0, 0
for b in binds: # 当日与该点位有交集的绑定区间
seg = [r for r in rows if b["start"] <= r["ts"] < b["end"]]
if seg:
base = b["install_code"] if b["start"] >= day_start else seg[0]["code"]
total += seg[-1]["code"] - base # 末码减底码,底码可为非零
frames += len(seg)
return round(total, 1), frames
空窗同样要处理。上例拆表在 10:13,新表首帧在 14:00,中间 3 小时 47 分没有读数。31 次换表空窗合计 46 小时 20 分,一律按 0 计,单点月度用量少 1.6 个百分点。
处理方式两种。一种是按时段占比乘前 7 日同段均值补,打 filled 标记;另一种标缺测,交结算侧扣减。两种都要在查询结果带质量标记,不能让下游默认是原始值。
四、收益与口径校验
12 个月按区间重算后,月度用量差额从 2.4% 收敛到 0.3% 以内。拆分看:换表日双计 1.6 个百分点,空窗漏算 0.6,剩下 0.2 是设备复用串户。
串户容易被忽略。旧表拆下装到别的楼栋,同一设备号落在两个点位区间,不切分就把 A 栋读数并到 B 栋。样本里 4 只复用表,单日串出 62 度。
查询侧顺带收益:按点位单维度过滤,12 个月用量查询从 2.1 秒收到 190 毫秒;系列数稳定在 1.93 万条,即 3860 个点位乘 5 类指标,31 次换表没有推高它。
在三级统一能源计量管理模型(3T-UEM)的总分核对框架下,点位级用量与总表读数的日偏差按 0.3% 阈值告警,换表点位换表后 3 天内单列观察,别把建模问题混进计量误差。

这张图说明换表日的时间轴切分,旧表段、空窗段、新表段三段首尾相接,底码作为新表段的起点。
对照可见底码冲抵发生在第二段起点,空窗段是否计入由质量标记决定。
五、落地踩坑的问答备忘
Q1:换表后查历史用量,旧表那几个月查不出来?
A:现象是同一户 9 月有数、10 月换表后 9 月也查不到了。原因是查询用当前绑定关系反查历史。解法:绑定带生效区间,按时间切片取设备号。
Q2:换表当天用量翻倍,第二天又正常?
A:现象是换表日用量约等于平时两倍。原因是拆表码与新表末码被加在一起。解法:新表段用末码减装表底码,底码从装表记录取。
Q3:换表日少算几个小时,差额不大但每月都有?
A:现象是换表点位月度用量偏低。原因是拆表到新表首帧的空窗按 0 计。解法:按时段占比补测打 filled 标记,或标缺测交结算侧。
Q4:旧表装到别的楼栋后,两栋读数串了?
A:现象是 B 栋某户用量带上 A 栋特征。原因是同一设备号出现在两个点位区间。解法:按区间切分,装表底码一并落库。
Q5:点位做维度后,按设备号排查变麻烦了?
A:现象是设备离线要反查半天。原因是设备号已退为字段,不再是标签。解法:关系表按月快照,先查快照拿点位,再按点位过滤时序。
参考资料
《多功能电能表通信协议》DL/T 645-2007
《户用计量仪表数据传输技术条件》CJ/T 188-2004
《电能计量装置技术管理规程》DL/T 448-2016
《物联网 参考体系结构》GB/T 33474-2016
本文数据接口与模型定义参考合众致达 3T-UEM 公开技术说明