networkx 中节点属性“丢失”通常并非保存失败,而是因数据中存在同一节点的多条属性记录,后写入的值覆盖了前值,导致断言校验不一致。本文详解该常见陷阱及安全赋值方案。
在您的代码中

这与 NetworkX 本身无关,而是数据层面的典型问题:节点属性应具有确定性,但原始数据存在“一对多”映射(一个节点对应多个日期)。NetworkX 的 G.nodes[n]["attr"] 是普通 Python 字典赋值,不提供冲突检测或合并逻辑。
✅ 正确做法:首次赋值时检查是否存在,避免意外覆盖
# 替换原赋值逻辑:
date_val = line.split()[1]
node_int = int(nodeID)
if node_int in G:
if "date" not in G.nodes[node_int]:
G.nodes[node_int]["date"] = date_val
# else: 可选择跳过、报错或记录警告
else:
G.add_node(node_int, date=date_val) # 直接初始化属性⚠️ 进阶建议:
if "date" not in G.nodes[node_int]:
G.nodes[node_int]["date"] = []
G.nodes[node_int]["date"].append(date_val)总结:NetworkX 完全忠实执行您的赋值指令——所谓“属性未保存”,本质是多次写入引发的静默覆盖。务必在数据加载阶段校验节点唯一性,并根据语义选择覆盖、跳过或聚合策略。