先把两个报表的“一天”定义写清楚,再决定是改报表时区还是改对齐脚本。如果两份数据都能重新导出,统一成同一时区最省事;如果其中一份来自无法改时区的第三方后台,就保留原时区,在分析层做跨时区归并。关键动作是:确认每个时间字段代表的是事件发生时间还是报表汇总时间,然后按同一绝对时间区间截取,而不是按各自日历上的“同一天”直接相减。
时区不一致通常有三种来源,处理方式完全不同。第一种是事件时间被存储为本地时间且不带偏移量,例如某条记录写着“2024-03-01 23:30”,但没说是哪个时区。第二种是报表按账户时区聚合,原始事件其实带UTC时间戳。第三种是导出工具在生成CSV时把时间转成了导出者所在时区。只有第一种需要推断,后两种都能通过字段名或导出设置确认。
可核对的证据包括:检查同一事件在两张报表中的时间差是否恒定为整数小时;查看时间字段是否带“Z”或“+08:00”后缀;对比两份数据在跨日边界附近的数量变化。如果差值随日期变化,可能是夏令时,而不是固定偏移。
优先统一时区。把两份报表都按UTC或同一业务时区重新导出,再按该时区的自然日聚合。动作是修改导出参数或在查询中显式转换时区,结果是后续所有对比都基于同一日历边界,不需要每次分析都做偏移换算。例外是:如果业务方只看本地日历日的投放效果,而平台报表只能按平台时区导出,那就不要强行统一,改用下面的归并方案。
保留原始时区,在分析层建立“绝对时间区间”作为对齐基准。例如把两边的日数据都转换成以UTC零点为边界的区间,再重新聚合。动作是写一个转换步骤,把每个报表的日期字段加上或减去固定偏移,得到UTC时间,然后按UTC日期分组。结果是两份数据可以逐日对比。例外是:如果偏移量不是整数小时,或存在夏令时切换,必须用带时区库的转换函数,不能手工加减小时。
假设报表A按UTC+8聚合,报表B按UTC聚合,两份都只有“日期”和“转化数”两列。某天A显示3月1日有100次转化,B显示3月1日有80次。直接相减会得出A比B多20的结论,但这个比较没有意义,因为A的3月1日覆盖的是UTC时间2月28日16:00到3月1日16:00,B的3月1日覆盖的是UTC 3月1日00:00到24:00,两者重叠只有16小时。
正确做法是:把A的3月1日拆成UTC 2月28日16:00–3月1日16:00,把B的3月1日拆成UTC 3月1日00:00–24:00,然后取交集UTC 3月1日00:00–16:00,或者统一按UTC重新导出。这个例子里没有真实数据,只用于说明比较区间必须一致。
对齐之后如果仍然出现与直觉相反的结果,不要立刻归因于渠道效果变化。先检查三件事:
这些因素都可能让对齐后的数字仍然不一致。动作是逐项排除,每排除一项就缩小一次解释范围。如果排除后差异仍然存在,再考虑时区之外的口径问题。
一旦确定用哪种方案,就把规则写进分析文档或脚本注释,包括:使用哪个时区、如何处理夏令时、日期字段的含义、以及遇到无法重新导出的报表时采用哪种归并方式。这样下次出现类似问题时,不需要重新推断,也能让其他人复核你的对齐逻辑。对齐的目标不是让两个数字相等,而是让比较建立在同一时间区间和同一指标定义上。