如何用pandas.read_xml读取XML父节点的loc属性?
解决方案
你的问题在于直接选取hour节点时,pandas只会提取该节点的子元素,无法自动继承父节点forecast的loc属性。以下两种方法可以解决这个问题:
方法一:读取父节点再展开子节点(推荐)
通过先读取forecast节点(包含loc属性和hour子节点列表),再将子节点列表展开为多行,最后拆分合并列:
import pandas as pd # 注意:原代码的`ecoding`是拼写错误,应为`encoding` df = pd.read_xml("URL_TO_MY_ZIP_FILE", encoding='UTF-8', xpath='.//forecast') # 将hour列的列表展开为单独行 df = df.explode('hour').reset_index(drop=True) # 将hour列的嵌套数据拆分为独立列,与loc列合并 final_df = pd.concat([df['loc'], df['hour'].apply(pd.Series)], axis=1)
执行后final_df就会包含你需要的date、time、val、loc四列,结构和目标一致。
方法二:手动解析XML构造数据
如果需要更精细的控制,可以直接使用xml.etree.ElementTree解析压缩包内的XML,手动提取所需字段:
import pandas as pd import xml.etree.ElementTree as ET from zipfile import ZipFile # 读取压缩包中的XML文件 with ZipFile("URL_TO_MY_ZIP_FILE") as zip_file: # 假设压缩包内只有一个XML文件,取第一个文件名 xml_filename = zip_file.namelist()[0] with zip_file.open(xml_filename) as xml_file: tree = ET.parse(xml_file) root = tree.getroot() # 遍历所有forecast和hour节点,构造数据列表 data_rows = [] for forecast_node in root.findall('.//forecast'): loc_value = forecast_node.get('loc') for hour_node in forecast_node.findall('.//hour'): data_rows.append({ 'date': hour_node.find('date').text, 'time': hour_node.find('time').text, 'val': hour_node.find('val').text, 'loc': loc_value }) # 转换为DataFrame final_df = pd.DataFrame(data_rows)
补充说明
- 你之前尝试的
xpath='./forecast[@loc="*"]/hour'错误在于[@loc="*"]是错误语法,匹配任意loc属性应该用[@loc],但即使修正,依然无法获取父节点属性,因为pandas只提取hour节点的内容。 xpath='./forecast/'末尾的斜杠是无效语法,导致报错,正确的写法是xpath='./forecast'。
内容的提问来源于stack exchange,提问作者user2128702
相关产品推荐
相关产品推荐

