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

如何基于Pandas DataFrame生成指定格式的XML文件?

问题

我有如下结构的Pandas DataFrame(包含NaN、NaT空值):

Date             Min       Max         C
 
01.01.2003     01.01.2003  Nan         NaT 
02.01.2003     Nan         Nan         NaT    
03.01.2003     Nan         Nan         NaT
04.01.2003     Nan         04.01.2003  NaT 
06.01.2003     06.01.2003  Nan         NaT
07.01.2003     Nan         Nan         NaT
08.01.2003     Nan         08.01.1993  NaT
09.01.2003     Nan         Nan         09.01.2003
14.01.2003     14.01.2003  Nan         NaT
15.01.2003     Nan         Nan         NaT           
16.01.2003     Nan         16.01.2003  NaT
29.01.2003     Nan         Nan         29.01.2003 

期望生成如下格式的XML文件:

<Or>
  <Date Source="test" test2="test3">
   <Min>01.01.2003</Min>
   <Max>04.01.2003</Max>
  </Date>
  <Date Source="test" test2="test3">
   <Min>06.01.2003</Min>
   <Max>08.01.2003</Max>
  </Date>
  <Date Source="test" test2="test3">
   <Min>14.01.2003</Min>
   <Max>16.01.2003</Max>
  </Date>
  <Date Source="test" test2="test3">
    09.01.2003 29.01.2003
   <Dates></Dates>
</Date>
</Or>

目前使用以下Python代码生成XML:

import pandas as pd
import xml.etree.ElementTree as gfg

# 假设这里有读取DataFrame的代码,比如df = pd.read_csv(...)
data = gfg.Element("Or")
for idx, row in data.iterrows():
    element1 = gfg.SubElement(data, "Test")
    element2 = gfg.SubElement(data, "Test2")                
    s_elem1 = gfg.SubElement(element1, 'Min')
    s_elem2 = gfg.SubElement(element1, 'Max')
    s_elem1.text=row['Min']
    s_elem2.text=row['Max']
    
    b_xml=gfg.tostring(data)

由于代码逐行遍历DataFrame,会生成包含空值的元素,无法实现将Min与对应Max配对、以及处理C列日期的需求,请问需如何修改代码以得到目标XML结构?

解决方案

要实现需求,需要先对DataFrame进行数据清洗和分组配对,再生成对应XML结构,步骤如下:

1. 预处理DataFrame

首先提取非空的Min、Max和C列数据,然后将相邻的Min和Max配对,同时收集C列的所有非空日期:

import pandas as pd
import xml.etree.ElementTree as gfg

# 构造或读取你的DataFrame
df = pd.DataFrame({
    'Date': ['01.01.2003', '02.01.2003', '03.01.2003', '04.01.2003', '06.01.2003', '07.01.2003', '08.01.2003', '09.01.2003', '14.01.2003', '15.01.2003', '16.01.2003', '29.01.2003'],
    'Min': ['01.01.2003', pd.NA, pd.NA, pd.NA, '06.01.2003', pd.NA, pd.NA, pd.NA, '14.01.2003', pd.NA, pd.NA, pd.NA],
    'Max': [pd.NA, pd.NA, pd.NA, '04.01.2003', pd.NA, pd.NA, '08.01.1993', pd.NA, pd.NA, pd.NA, '16.01.2003', pd.NA],
    'C': [pd.NaT, pd.NaT, pd.NaT, pd.NaT, pd.NaT, pd.NaT, pd.NaT, '09.01.2003', pd.NaT, pd.NaT, pd.NaT, '29.01.2003']
})

# 提取非空的Min和Max值并配对
min_dates = df[df['Min'].notna()]['Min'].tolist()
max_dates = df[df['Max'].notna()]['Max'].tolist()
min_max_pairs = list(zip(min_dates, max_dates))

# 提取C列非空日期
c_dates = df[df['C'].notna()]['C'].tolist()

2. 生成目标XML结构

根据配对好的数据和C列日期,构建符合要求的XML:

# 创建根节点
root = gfg.Element("Or")

# 生成Min-Max对应的Date节点
for min_date, max_date in min_max_pairs:
    date_elem = gfg.SubElement(root, "Date", Source="test", test2="test3")
    min_elem = gfg.SubElement(date_elem, "Min")
    min_elem.text = min_date
    max_elem = gfg.SubElement(date_elem, "Max")
    max_elem.text = max_date

# 生成C列日期对应的Date节点
if c_dates:
    c_date_elem = gfg.SubElement(root, "Date", Source="test", test2="test3")
    # 将C列日期拼接为文本内容
    c_date_elem.text = ' '.join(c_dates)
    gfg.SubElement(c_date_elem, "Dates")

# 格式化XML缩进(Python 3.9+支持)
gfg.indent(root)
# 转换为可读的XML字符串
xml_str = gfg.tostring(root, encoding='utf-8').decode('utf-8')
print(xml_str)

关键说明

  • 先过滤非空值提取有效数据,避免逐行遍历产生空元素;
  • 用zip将Min和Max一一配对(需确保两者数量对应,若有特殊配对逻辑可自行调整);
  • 单独处理C列非空日期,拼接后作为对应Date节点的文本内容;
  • gfg.indent用于美化XML结构,低版本Python可手动实现缩进逻辑。

内容的提问来源于stack exchange,提问作者beginner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:45:58