为什么Pandas apply方法会将原生datetime转为自定义Timestamp对象
这是Pandas的原生设计,属于预期内的底层特性,转换发生在apply方法执行完、合并所有行结果生成新DataFrame的阶段,具体原因如下:
- Pandas有自动列类型推断机制:你在逐行处理的
_normalize_users_dataframe函数内操作的是单行的Series对象,此时赋值的datetime.datetime只是作为单个Python对象存储在临时对象里,还没有触发整列的类型统一逻辑。当所有行处理完成后,Pandas会将所有行的返回结果拼接为完整DataFrame,这一步会对每一列的所有元素做类型推断,对于全列都是时间类对象的列,默认会转换为Pandas自研的Timestamp类型,对应底层存储格式为datetime64[ns]。 - 这个转换的核心目的是提升性能:原生Python
datetime对象只能以objectdtype存储,每个元素都是独立的Python对象,无法发挥Pandas的矢量化计算优势,内存占用高、运算速度慢。而Timestamp是datetime.datetime的子类,兼容绝大多数原生datetime的接口,你可以直接调用.year、.strftime()等常用方法无需转换,同时底层基于Numpy的固定大小时间类型存储,支持批量矢量化运算,性能比object存储的datetime高1~2个数量级。 - 如果确实有特殊场景需要保留原生
datetime类型,可以在apply执行结束后手动转换:
df['last_seen'] = df['last_seen'].dt.to_pydatetime()
转换后该列的dtype会变回object,所有元素都是原生Python datetime对象,但会损失时间类的矢量化操作能力,非必要不建议做这个转换。
内容的提问来源于stack exchange,提问作者shzetb
相关产品推荐
相关产品推荐

