一份导出的订单表,日期列里有的写成 2024/3/5,有的写成 2024-03-05 08:30:00,还有几行是空的。跑一遍 pd.to_datetime,结果整列变成 object,或者冒出一串 NaT。查起来很烦,规律其实就那么几条。

先确认这一列是什么类型

用 dtypes 看一眼,是 object 说明里面混着字符串和空值,是 datetime 说明已经转好了。已经转好的列再转一次,格式参数对不上反而会把好数据变 NaT。

转之前把前后空格和全角字符处理掉,导出的表格里这两种情况特别多,肉眼看不出来,解析时直接失败。

指定 format 又快又稳

格式统一的数据,把 format 写成 %Y-%m-%d %H:%M:%S 这类明确的形式,解析速度比让它自己猜快很多,也避免了歧义。数据量上百万行的时候,这个差别非常明显。

格式不统一,可以先按主要格式转一次,把剩下的缺失行挑出来单独处理。较新版本的 pandas 支持给 format 传一个列表,让它按几种格式依次尝试,省掉手写分支。

确实有脏数据又不想逐条查,把 errors 设成 coerce,转不了的置为 NaT,再单独看这些行。默认的 raise 会在第一个坏值处直接抛错,排查小文件还行,大文件很折磨人。

时间戳和时区

列里是纯数字的,八成是时间戳,要加 unit 参数,按秒给 s,按毫秒给 ms,弄错了会差出几十年,转出来是 1970 年附近就是单位不对。带时区的数据加 utc 参数先统一到 UTC,再按需要换成本地时区,别直接截字符串。

日期顺序别猜

3/4 到底是三月四日还是四月三日,取决于数据来源,工具猜不准。有这种列,先问清楚来源系统的习惯,必要时用 dayfirst 明确指定。猜错一次,后面所有按月的统计全歪,而且不报错,最难发现。

处理时间列的思路就一句:先看数据长什么样,再决定要不要指定格式,指望工具自动识别,早晚踩坑。