在Pandas DataFrame中插入行时NaN转为NaT的原因及解决方法
问题原因
- 弃用的
append方法类型推断缺陷:append在pandas 2.0+版本已被正式弃用,该方法传入字典构造新行时的类型兼容逻辑存在问题,会错误对不同列的取值做跨列类型推断,导致数值列的np.nan被错误和时间类型做兼容处理,最终数值列被降级为object类型,甚至出现NaN被转为NaT的异常表现。 - 直接向datetime列插入
np.nan会破坏类型:datetime类型的合法空值为NaT,np.nan本身属于浮点类型,直接插入datetime列会触发整列转为兼容多类型的object类型。
解决方法
方案1:单行插入(需手动指定新行时间)
弃用append方法,改用pd.concat拼接类型匹配的新行DataFrame:
from datetime import timedelta import pandas as pd date2 = date1 + timedelta(seconds=300) # 构造和原df结构、列类型完全匹配的新行DataFrame new_df = pd.DataFrame([[date2, np.nan, np.nan]], columns=df.columns) df = pd.concat([df, new_df], ignore_index=True)
方案2:自动补全所有5分钟间隔缺失行(适配业务场景)
针对你需要补全固定间隔时间序列的需求,直接使用时间索引重采样的方法更高效,无需手动遍历查找缺失时间点:
# 将date列设为时间索引,按5分钟频率自动补全所有缺失时间点,数值列默认填充NaN df = df.set_index("date").asfreq("5T").reset_index()
执行任意方案后查看df.dtypes,可确认date列保持带时区的datetime类型,a、b列保持float64类型,空值为标准NaN,完全符合预期。
内容的提问来源于stack exchange,提问作者Francois
相关产品推荐
相关产品推荐

