pandas Timestamp转datetime.datetime赋值后类型未保留问题求解
问题复现与现象
- 操作对象为pandas DataFrame
df_unix的LastLoginDate字段- 初始状态:索引为45的单元格值类型为
pandas._libs.tslibs.timestamps.Timestamp - 单值转换验证:对该单元格值单独调用
to_pydatetime(),返回类型为datetime.datetime,单值转换逻辑生效 - 赋值后异常:执行
df_unix.loc[45,'LastLoginDate'] = df_unix.loc[i,'LastLoginDate'].to_pydatetime()后,该位置值类型仍为pandas._libs.tslibs.timestamps.Timestamp,转换结果未留存
- 初始状态:索引为45的单元格值类型为
核心原因
pandas会对同属一个Series的所有值做统一类型对齐。若LastLoginDate列的基础dtype为datetime64[ns],无论赋值传入的是原生datetime.datetime还是pandas.Timestamp,都会被自动转换为Timestamp类型以匹配列的统一dtype约束,原生datetime格式无法在该列中单独留存。
可落地解决方案
- 若需要在DataFrame中留存原生datetime类型:先将列转为object类型解除dtype约束,再执行赋值
# 先将整列转为object类型 df_unix['LastLoginDate'] = df_unix['LastLoginDate'].astype(object) # 再执行赋值操作,原生datetime类型可正常留存 df_unix.loc[45,'LastLoginDate'] = df_unix.loc[i,'LastLoginDate'].to_pydatetime() - 若仅需要使用值的原生datetime格式:无需修改DataFrame存储结构,取值时单独调用转换方法即可
# 每次取值时转换为原生datetime native_dt = df_unix.loc[45,'LastLoginDate'].to_pydatetime() - 若需要整列所有值都转为原生datetime存储:可直接对整列批量转换
import pandas as pd df_unix['LastLoginDate'] = df_unix['LastLoginDate'].apply( lambda x: x.to_pydatetime() if pd.notna(x) else x )
内容的提问来源于stack exchange,提问作者Damián Cordoni
相关产品推荐
相关产品推荐

