You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:30:50