You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:33:37