使用pd.DataFrame.from_records构造含Timestamp与NaT列的DataFrame遇错求助
解决pd.DataFrame.from_records()处理混合Timestamp/NaT列的报错问题
核心问题原因
你遇到的报错是因为from_records()自动推断列类型时,对混合pd.Timestamp和pd.NaT的列识别混乱,错误地将NaT当成浮点型NaN,进而尝试把列转为整数类型导致ValueError。替换NaT为pd.NA能解决,但没必要逐个字典修改,下面是几个更高效的方案:
方案1:构造时显式指定列的dtype
直接在调用from_records()时,给存在混合类型的列指定datetime64[ns]类型,让pandas直接按时间类型解析,正确识别NaT:
import pandas as pd # 示例数据 records = [ {"event_time": pd.Timestamp("2024-01-01"), "value": 10}, {"event_time": pd.NaT, "value": 20} ] # 显式指定event_time列为datetime类型 df = pd.DataFrame.from_records(records, dtype={"event_time": "datetime64[ns]"})
方案2:用pd.Series预处理每一列
通过字典推导式把每列数据转为pd.Series,pd.Series能自动识别Timestamp和NaT的组合并设为正确的时间类型,再构造DataFrame:
# 提取所有列名 col_names = records[0].keys() # 按列生成Series col_data = {col: pd.Series([row[col] for row in records]) for col in col_names} # 构造DataFrame df = pd.DataFrame(col_data)
方案3:用pd.json_normalize替代from_records
json_normalize对混合类型和缺失值的类型推断更稳健,普通字典列表也能直接使用,无需额外配置:
df = pd.json_normalize(records)
这三个方案都是基于向量/批量操作,比逐个遍历字典修改效率高得多,尤其是数据量较大时优势明显。
内容的提问来源于stack exchange,提问作者obviouslyalive
相关产品推荐
相关产品推荐

