时间线将不同来源的记录放到可比较的时间尺度上。排序之前,需要先解释每个时间字段:它记录什么动作,采用哪种编码、单位和时区,是否受到设备时钟或写入延迟影响。格式整齐的时间表,仍可能把几个不同含义的字段混在一起。
以下示例均为合成数据。Python 代码使用标准库;涉及地区时区的部分需要 Python 3.9 或更新版本,以及可用的 IANA 时区数据。
时间字段包含的条件
时间值宜同时保留原始形式与解释结果。一个整数落在合理日期范围,只能提示一种候选解释,不能独自证明它采用 Unix 秒或毫秒。
| 需要记录的条件 |
示例及作用 |
| 事件语义 |
消息创建、发送、服务器接收或本地入库;这些时间可能不同 |
| 原始值 |
1704067200123,保留转换前的数值 |
| 编码与纪元 |
已确认是从 Unix epoch 起计算的整数 |
| 单位 |
毫秒;决定除数和输出精度 |
| 原有时区依据 |
字段说明、系统配置或可独立核对的样例 |
| 归一化值 |
使用带偏移的表示,例如 UTC 的 +00:00 |
| 精度和误差 |
字段分辨率、设备时钟偏差与记录延迟 |
字段名 created_at 不一定表示用户行为发生时刻。它可能是对象创建时间,也可能是数据库插入或同步时间。将其与网络连接记录关联之前,应先确认两者描述的事件关系。
对于没有时区的日期字符串,需要保存原文并查明解释依据。Python 将不含时区信息的日期时间称为 naive 对象;它不足以单独确定 UTC 时刻。代码中应明确时区,避免分析机器的设置悄悄参与转换。相关行为见 Python datetime 文档。
一个毫秒时间值的转换
假设字段说明已经确认 1704067200123 为 Unix 毫秒值。可以先用整数运算分离秒和剩余毫秒,得到 UTC,再转换显示时区。
from datetime import datetime, time