将不同的 XML 读取到 pandas 数据帧

斯瓦瓦

我有几个 XML 文件,我想将它们读入 pandas 数据帧并将它们合并到一个具有统一时间戳的数据帧中。

例如,数据框看起来像这样:

# PTU.xml:

<?xml version='1.0' encoding='utf8'?>
<PtuResults>
  <Row DataSrvTime="2021-07-08T08:58:14.3942671" SP="950.067" PFH="950.067" T="291.810" Hum="84.035" Alt="590.081" Status="0" />
  <Row DataSrvTime="2021-07-08T08:58:36.8831974" SP="950.935" PFH="949.456" T="291.569" Hum="89.576" Alt="582.223" Status="0" />
  <Row DataSrvTime="2021-07-08T08:58:36.8835716" SP="950.256" PFH="949.207" T="291.072" Hum="91.548" Alt="588.357" Status="0" />
</PtuResults>

# - or -
#
# AMS.xml:

<?xml version='1.0' encoding='utf8'?>
<AdditionalSensorData>
  <Row MeasurementOffset="-0.403" DataSrvTime="2021-07-08T08:43:29.0616419" GpsTO="12" XData=" C7 10 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2FE 320 0 0 230 165 111 224 1201 13BF 13CB B 0 58 1 278 B695" />
  <Row MeasurementOffset="-0.253" DataSrvTime="2021-07-08T08:43:30.0866790" GpsTO="35" XData=" C2 16 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 320 0 0 0 23A 133 111 223 118C 1236 1237 9 0 6B 1 278 9B2" />
  <Row MeasurementOffset="-0.103" DataSrvTime="2021-07-08T08:43:31.1107931" GpsTO="58" XData=" CB E 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2FE 341 0 0 230 179 111 222 11E0 1396 13A2 10 0 7C 2 278 3ECA" />
</AdditionalSensorData>

首先,我正在阅读 XML 文件:

import pandas as pd
import numpy as np
import os
import xml.etree.ElementTree as ET 

# Mypath with datafiles:
path = 'c:/mypath/'

# Names of specific files:
PTU = 'PTU.xml'
GPS = 'GPS.xml'
AMS = 'AMS.xml'

data_PTU = ET.parse(path + PTU).getroot()
data_GPS = ET.parse(path + GPS).getroot()
data_AMS = ET.parse(path + AMS).getroot()

我定义了一个主要例程,用于将属性名称作为列名转换为 Pandas 数据框:

def parse_XML(xml_file, df_cols): 
    xroot = ET.parse(xml_file).getroot()
    rows = []
    
    for attribute in xroot: 
        res = []
        res.append(attribute.attrib.get(df_cols[0]))
        for element in df_cols[:]: 

            if attribute is not None and attribute.find(element) is not None:
                res.append(attribute.find(element))
            else: 
                res.append(None)
        rows.append({df_cols[i]: res[i] 
                     for i, _ in enumerate(df_cols)})
    
    out_df = pd.DataFrame(rows, columns=df_cols)
        
    return out_df

最后我正在使用例如

parse_XML(path + AMS,["DataSrvTime", "XData"]) 
# -or-
parse_XML(path + PTU, ["DataSrvTime", "SP", "T", "Hum", "Alt"])

制作一个数据框。结果显示了一个数据框,其中第一列作为索引列,在这种情况下,第二列作为“DataSrvTime”,并且任何后续列都填充了“None”。如果我将订单更改为

parse_XML(path + AMS,["XData", "DataSrvTime"]) 

例如,显示了 XData,但 DataSrvTime 列包含“无”。有谁知道我的错误在哪里?

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

如果对数据帧的读取是完美的,则进一步的计划是将所有不同的数据帧(例如 AMS、PTU、GPS)与(Pandas) resample('S').mean()统一(Pandas) dataframe.interpolate()的时间戳合并到一个数据帧中。您会推荐其他解决方案吗?

感谢您的阅读和帮助。

完美的

鉴于您的以属性为中心的 XML 相对扁平,请考虑新的 IO 方法,pandas.read_xml. 然后,这两个数据帧或在需要将日期时间设置为索引的数据帧列表上merge运行迭代连接。concat

pd.merge

final_df = pd.merge(
    pd.read_xml('PTU.xml'), pd.read_xml('AMS.xml'),
    on = "DataSrvTime", how = "outer"
)

pd.concat

df_list = [
    pd.read_xml(f).set_index("DataSrvTime")
    for f in 
    ['PTU.xml', 'GPS.xml', 'AMS.xml']
]

final_df = pd.concat(df_list, axis=0)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章