将孙子 XML 解析为 pandas 数据框

问题描述 投票:0回答:1

我看过各种问题和答案,但没有一个完全满足我的需求。

我有 xml 平面文件(由硬件 SCADA 系统生成),格式如下(编辑:之前草率复制和粘贴,现在用第二个修复并且有空字段):

<?xml version='1.0' encoding='UTF-8'?>
<doc>
    <row>
        <DATE>2022-01-14 06:04:18</DATE>
        <MS>9</MS>
        <POSITION_1>
            <VALUE>53.9850 </VALUE>
            <STATUSVALUE>1327104</STATUSVALUE>
            <STATUS>    +</STATUS>
        </POSITION_1>
        <POSITION_2>
            <VALUE>54.3050 </VALUE>
            <STATUSVALUE>1327104</STATUSVALUE>
            <STATUS>-F- +</STATUS>
        </POSITION_2>
        <POSITION_3>
            <VALUE>54.0450 </VALUE>
            <STATUSVALUE>1327104</STATUSVALUE>
            </STATUS>
        </POSITION_3>
    </row>
    <row>
        <DATE>2022-01-14 06:04:42</DATE>
        <MS>302</MS>
        <POSITION_1>
            <VALUE>54.2600 </VALUE>
            <STATUSVALUE>1327104</STATUSVALUE>
            <STATUS>    +</STATUS>
        </POSITION_1>
        <POSITION_2>
            <VALUE>54.4350 </VALUE>
            <STATUSVALUE>1327104</STATUSVALUE>
            <STATUS>    +</STATUS>
        </POSITION_2>
        <POSITION_3>
            <VALUE>54.0800 </VALUE>
            <STATUSVALUE>1327104</STATUSVALUE>
            <STATUS>    +</STATUS>
        </POSITION_3>
    </row>
</doc>

(实际上是 POSITION_6)并且希望返回一个与我使用 Power Query 执行导入并最终得到列时 Excel 创建的格式相同的数据框:

DATE  
MS  
POSITION_1.VALUE  
POSITION_1.STATUSVALUE  
POSITION_1.STATUS  
POSITION_2.VALUE  
POSITION_2.STATUSVALUE  
POSITION_2.STATUS  
POSITION_3.VALUE  
POSITION_3.STATUSVALUE  
POSITION_3.STATUS  

Excel(有一些争论)给出:

目前我正在使用 Pandas read_xml,我刚刚得到:

                     DATE   MS  POSITION_1  ...  POSITION_4  POSITION_5  POSITION_6
0     2022-01-14 06:02:36  193         NaN  ...         NaN         NaN         NaN
1     2022-01-14 06:04:18    9         NaN  ...         NaN         NaN         NaN
2     2022-01-14 06:04:42  302         NaN  ...         NaN         NaN         NaN
3     2022-01-14 06:05:15  582         NaN  ...         NaN         NaN         NaN
4     2022-01-14 06:05:46  579         NaN  ...         NaN         NaN         NaN

因为它的读数不低于树中的 POSITION_X 级别

pandas dataframe xml-parsing
1个回答
0
投票

除了额外的

</row>
和 IIUC 之外,你还可以使用 来达到
POSITION_*
details :

import xml.etree.ElementTree as ET

data = [
    dict(
        {fld: row.findtext(fld) for fld in ["DATE", "MS"]},
        **{f"{p.tag}.{details.tag}": details.text for p in row for details in p}
    )
    for row in ET.parse("file.xml").findall("row") # <- put here the actual filepath
]

df = pd.DataFrame(data)

输出:

日期 MS POSITION_1.VALUE POSITION_1.STATUSVALUE POSITION_1.状态 POSITION_2.VALUE POSITION_2.STATUSVALUE POSITION_2.状态 POSITION_3.VALUE POSITION_3.STATUSVALUE POSITION_3.状态
2022-01-14 06:02:36 193 53.985 1327104 + 54.305 1327104 -F-+ 54.045 1327104
© www.soinside.com 2019 - 2024. All rights reserved.