我有幾個 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()的時間戳合并到一個資料幀中。您會推薦其他解決方案嗎?
感謝您的閱讀和幫助。
uj5u.com熱心網友回復:
鑒于您的以屬性為中心的 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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/492132.html
標籤:python-3.x xml 数据框
