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

Python使用icalendar解析ICS文件参会者PARTSTAT状态并存入DataFrame

解决方案

你报错的核心原因有两个:

  1. 当事件包含多名参会者时,event.get('attendee') 返回的是参会者对象列表,不是单个对象,无法直接调用.params属性;如果事件只有1名参会者,返回的是单个参会者对象,两种结构不统一。
  2. icalendar库的参数键名是全大写格式,你写小写的partstat也无法匹配到对应值。

另外你原有代码的结构会把所有参会者塞到同一行的attendee字段中,无法和参会状态一一对应,建议调整为每个参会者单独占一行的存储结构,修改后的代码如下:

import pandas as pd
from icalendar import Calendar

# 初始化总表
allevents = pd.DataFrame(columns = ['uid', 'start', 'end', 'summary', 'attendee', 'partstat','description'])
icsfile = "替换为你的ics文件路径"

# 读取解析ics文件
with open(icsfile, 'rb') as g:
    gcal = Calendar.from_ical(g.read())

for event in gcal.walk('vevent'):
    # 提取事件公共字段
    base_info = {
        'uid': event.get('uid'),
        'start': event.decoded('dtstart'),
        'end': event.decoded('dtend'),
        'summary': event.get('summary'),
        'description': event.get('description')
    }
    # 兼容处理:单个参会者返回对象,多个返回列表,统一转成列表处理
    attendees = event.get('attendee', [])
    if not isinstance(attendees, list):
        attendees = [attendees]
    
    # 遍历每个参会者提取对应状态
    for att_obj in attendees:
        row = base_info.copy()
        # 参会者邮箱是对象本身的字符串值
        row['attendee'] = str(att_obj)
        # 提取PARTSTAT参数,无参数时默认返回UNKNOWN避免报错
        row['partstat'] = att_obj.params.get('PARTSTAT', 'UNKNOWN')
        # 插入总表
        allevents = pd.concat([allevents, pd.DataFrame([row])], ignore_index=True)

可选调整

如果你确实需要把同一事件的所有参会者和状态存在同一行,可以把遍历得到的所有(邮箱, 状态)对拼成字典或字符串存入对应字段,示例:

# 替换上面的遍历参会者部分即可
att_info = []
for att_obj in attendees:
    email = str(att_obj)
    stat = att_obj.params.get('PARTSTAT', 'UNKNOWN')
    att_info.append(f"{email}:{stat}")
base_info['attendee'] = ','.join([x.split(':')[0] for x in att_info])
base_info['partstat'] = ','.join([x.split(':')[1] for x in att_info])
allevents = pd.concat([allevents, pd.DataFrame([base_info])], ignore_index=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:15:04