先给结论:不要直接把两个报表的“日汇总”放在一起比较。先确认两边各自把哪一段时间算作“一天”,再把其中一边的明细按同一时区边界重新归集;如果明细粒度不够,就只能退回到共同覆盖的完整时段,或者改看周、月这类对时区边界不敏感的口径。对齐一天的数据,本质是对齐“哪24小时”,而不是对齐日期标签。
两种条件对应两种做法,选错方向会白费功夫。
判断依据不是报表看起来像不像,而是导出文件里有没有比“天”更细的时间字段,以及这个字段是否带时区标识。如果只有“2024-06-01 访问量 3200”这种一行一天的结构,就没有重切的空间。
这里还要区分一件事:时区不同和统计口径不同经常同时出现。第三方估算、搜索引擎报告和站内统计对“一次访问”的定义本来就可能不同,时区只是其中一层偏差。所以对齐时区之后如果数字仍有差距,不要继续在时区上找原因,那属于口径差异。
假设一边报表按 UTC 切天,另一边按 UTC+8 切天,你想统一到 UTC+8 的自然日。做法是把 UTC 那边的明细时间整体加 8 小时,再按 UTC+8 的 0 点到 24 点分组求和。
以站内日志为例,如果时间字段是 UTC 的 ISO 格式,可以先转成目标时区再取日期部分:
date_in_tz = to_timezone(ts, "Asia/Shanghai")
day_key = format(date_in_tz, "yyyy-MM-dd")
然后按 day_key 聚合。这个动作的结果是:原本落在 UTC 前一天 16:00 到 24:00 的记录,会被归到 UTC+8 的次日凌晨。下一步核对时,你会看到 UTC+8 这一天的量比原来 UTC 报表里同一天标签的量更大,这是正常现象,不是数据出错。
反过来,如果目标时区是 UTC,就把 UTC+8 的明细减 8 小时再归集。关键在于先确定“以谁为准”,再动手,不要两边都改。
完成归集后,用一段共同覆盖的时间做交叉验证:挑一个两边明细都完整的连续三天,分别归集后比较趋势形状。如果趋势一致、只是绝对值有稳定差距,说明时区对齐成功,剩下的是口径问题;如果趋势都错位,说明时区偏移量或夏令时处理有问题。
没有明细,就不能声称完成了精确对齐。此时有两个成立的选择。
选择依据是你要回答的问题。如果问题是“昨天投放后当天效果如何”,单日边界敏感,必须拿明细;如果问题是“这个渠道近一个月趋势怎样”,周月粒度足够,不必强求单日对齐。
例外情况要单独说明:如果时区差不是整小时,或者涉及夏令时切换日,那么“固定偏移量”这个前提就不成立,必须依赖带时区库的转换,不能手工加减小时。另外,如果某一侧的“天”本身按业务日切分,比如以凌晨某个时刻为界,那它既不是纯时区问题,也不是自然日问题,需要先问清对方的日切规则再对齐。
多个角色对同一天的数字有不同理解时,不要争论谁对谁错,把它拆成可核对项:
做完这些,你会发现很多“数字对不上”其实不是时区问题,而是有人在拿日汇总和明细比、有人在拿未回补数据和已回补数据比。把时区对齐作为第一步,把口径差异作为第二步,分歧就能变成一张能逐项打勾的核对表,而不是反复解释的僵局。