使用DyNetx从DataFrame创建动态图时遇节点添加问题
问题分析与解决
1. 关于[None, None, None]的问题
g.add_interaction()方法本身没有返回值,你用列表推导式执行该方法时,得到的就是由None组成的列表,这是正常现象,不代表节点/边未成功添加。可通过g.nodes()或g.edges(t)验证节点和边是否存在。
2. 关于Timestamp类型报错的问题
报错是因为新版本Pandas不再支持Timestamp与整数直接加减,而DyNetx旧版本内部代码可能存在这类操作。解决核心是将Pandas的Timestamp对象转换为DyNetx兼容的格式,比如Unix时间戳(整数)或Python原生datetime对象。
修复后的代码
import numpy as np import pandas as pd import dynetx as dn df = pd.DataFrame({'sent':['78','18','94','55','68','57','78','8','78','18'], 'received':['18','78','35','14','57','68','57','17','18','78'], 'time':['2017-06-02 05:41:34','2017-06-02 05:41:35', '2017-06-02 05:41:36','2017-06-02 05:41:37', '2017-06-02 05:41:38','2017-06-02 05:41:39', '2017-06-02 05:41:40','2017-06-02 05:41:41', '2017-06-02 05:41:42','2017-06-02 05:41:43']}) # 转换为秒级Unix时间戳(整数格式) df['time'] = pd.to_datetime(df['time']).astype(np.int64) // 10**9 g = dn.DynGraph(edge_removal=True) # 用普通循环替代列表推导式,避免生成无用的None列表 for idx, row in df.iterrows(): g.add_interaction(row['sent'], row['received'], row['time']) # 验证节点是否添加成功 print(g.nodes()) # 验证指定时刻的边 print(g.edges(t=df['time'][0]))
额外说明
- 若偏好使用原生datetime对象,可替换转换逻辑为:
df['time'] = pd.to_datetime(df['time']).dt.to_pydatetime() - 执行无返回值的方法时,用普通for循环比列表推导式更清晰,不会生成无用的None列表
内容的提问来源于stack exchange,提问作者Rebecca James
相关产品推荐
相关产品推荐

