向DataFrame前置行时出现TypeError:无法从ndarray减去DatetimeArray
问题分析:两种DataFrame构造方式的差异导致的类型错误
错误复现代码
import pandas as pd import numpy as np df = pd.DataFrame({"start": [pd.to_datetime("2001-01-01 08:00:00+00:00")]}) df1 = pd.DataFrame([np.nan], columns=df.columns) df1[["start"]] = [ df["start"].iloc[0], ] df = df1.append(df, ignore_index=True) df["start"] - df["start"].dt.normalize()
报错信息
TypeError: cannot subtract DatetimeArray from ndarray
正确代码示例
import pandas as pd import numpy as np df = pd.DataFrame({"start": [pd.to_datetime("2001-01-01 08:00:00+00:00")]}) df1 = pd.DataFrame([df["start"].iloc[0],], columns=df.columns) df = df1.append(df, ignore_index=True) df["start"] - df["start"].dt.normalize()
第一种构造方法的问题
- 初始类型污染:用
pd.DataFrame([np.nan], columns=df.columns)创建df1时,start列的类型会被初始化为float64(因为np.nan是浮点类型),而非原df中的*datetime64[ns, UTC]*类型。 - 赋值时的类型不兼容:后续给
df1[["start"]]赋值单个datetime对象时,pandas无法将这个datetime值正确转换为float64列的类型,最终导致该列变成了object类型(存储的是datetime对象的数组,而非pandas原生的DatetimeArray)。 - 运算时的类型冲突:当执行
df["start"] - df["start"].dt.normalize()时,df["start"]是object类型的ndarray,而df["start"].dt.normalize()返回的是DatetimeArray,两者类型不匹配,因此抛出类型错误。
而第二种方法直接用datetime对象构造DataFrame,start列会被正确识别为*datetime64[ns, UTC]*类型,后续的时间运算可以正常执行。
内容的提问来源于stack exchange,提问作者roulette01
相关产品推荐
相关产品推荐

