如何通过Brightway2导出含Technosphere位置信息的Ecoinvent数据库?
解决Brightway2导出Excel时Technosphere位置显示"unknown"的问题
默认的write_excel()方法不会包含Technosphere交换的位置信息,这就是你看到"unknown"的原因。ActivityBrowser能显示是因为它直接读取了Brightway内部存储的交换元数据,而导出工具没有默认提取这部分内容。
以下是两种可行的解决方法:
方法一:手动构建包含位置信息的Excel表格
直接用Pandas提取活动和Technosphere交换的位置数据,自定义导出内容:
import pandas as pd import brightway2 as bw import bw2io as bi # 导入数据库(保持原有步骤) importer = bi.SingleOutputEcospold2Importer('C://Users/.../ecoinvent391_cutoff_ecoSpold02/datasets','e391_') importer.apply_strategies() importer.statistics() # 提取活动及Technosphere交换的位置信息 export_data = [] for activity in importer.data: act_info = { "活动名称": activity["name"], "活动位置": activity.get("location", "unknown"), "活动类别": activity.get("categories", []) } for exchange in activity.get("exchanges", []): if exchange["type"] == "technosphere": row = act_info.copy() row.update({ "Technosphere流名称": exchange["name"], "Technosphere位置": exchange.get("location", "unknown"), "数量": exchange["amount"], "单位": exchange.get("unit", "") }) export_data.append(row) # 导出为Excel df = pd.DataFrame(export_data) df.to_excel("ecoinvent_tech_with_locations.xlsx", index=False)
方法二:修改导入策略确保位置信息被保留,再自定义导出
如果导入时交换的位置信息没有被正确加载,可以添加自定义策略来提取原始ecospold文件中的位置数据:
def retain_exchange_locations(importer): """自定义策略:从原始ecospold数据中提取交换的位置信息""" for activity in importer.data: for exchange in activity.get("exchanges", []): # 从交换的原始ecospold数据中获取位置 if "location" not in exchange and "data" in exchange: exchange["location"] = exchange["data"].get("location", "unknown") return importer # 应用默认策略后再应用自定义策略 importer.apply_strategies() importer.apply_strategy(retain_exchange_locations) # 之后再用方法一中的Pandas代码导出即可
注意:如果你的交换已经链接到Brightway数据库中的活动,也可以通过exchange['input']去查询对应活动的位置,但在导入阶段(未执行write_database()前),交换可能还未完成链接,所以优先从原始data字段提取更可靠。
内容的提问来源于stack exchange,提问作者Can.C
相关产品推荐
相关产品推荐

