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

使用PyPI库ics生成日历报错:'int'对象无'replace'属性

问题

我想用Python的pandas和ics库生成从2023年8月1日起365天的日历,每天事件名称为三位格式的序号(比如001、002),但运行代码后报错,代码和报错信息如下:

原代码

import pandas as pd
import datetime
from ics import Calendar, Event
for i in range(1, 365+1):
    c = Calendar()
    e = Event()
    e.name = i
    startdate = pd.Timestamp("08/01/2023")
    date = str(startdate + pd.DateOffset(days=i-1))
    print(str(i) + ": " + date)
    e.begin = date
    e.end = date
    c.events.add(e)

with open('my.ics', 'w') as my_file:
    my_file.write(c.serialize())

报错信息

Traceback (most recent call last):
  File "C:\Users\******\dev\66795\main.py", line 15, in <module>
    my_file.write(c.serialize())
  File "C:\Users\******\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\ics\component.py", line 72, in serialize
    output(self, container)
  File "C:\Users\******\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\ics\serializers\icalendar_serializer.py", line 27, in serialize_event
    container.append(event.serialize())
  File "C:\Users\******\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\ics\component.py", line 72, in serialize
    output(self, container)
  File "C:\Users\******\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\ics\serializers\event_serializer.py", line 51, in serialize_summary
    container.append(ContentLine("SUMMARY", value=escape_string(event.name)))
  File "C:\Users\******\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\ics\utils.py", line 218, in escape_string
    string = string.replace("\\", "\\\\")
AttributeError: 'int' object has no attribute 'replace'
错误原因
  1. 事件名称类型错误:ics库的Event.name要求是字符串类型,但原代码中直接赋值了整数i,导致序列化时调用字符串方法replace失败,触发AttributeError。
  2. Calendar对象重复创建:循环内每次都新建Calendar(),导致之前添加的事件被覆盖,最终只会写入最后一天的事件。
  3. 日期格式与序号格式不符合需求:原代码输出的日期是Timestamp默认字符串格式,序号也没有按三位补零格式化。
修正后的代码
import pandas as pd
from ics import Calendar, Event

# 初始化Calendar对象,放在循环外避免重置
c = Calendar()
start_date = pd.Timestamp("2023-08-01")

for i in range(1, 366):
    e = Event()
    # 格式化序号为三位补零的字符串
    e.name = f"{i:03d}"
    # 计算当日日期
    current_date = start_date + pd.DateOffset(days=i-1)
    # 转换为ics兼容的日期格式(YYYY-MM-DD)
    date_str = current_date.strftime("%Y-%m-%d")
    # 设置全天事件的开始和结束,ics中全天事件end设为次日可避免显示异常
    e.begin = date_str
    e.end = (current_date + pd.DateOffset(days=1)).strftime("%Y-%m-%d")
    # 添加事件到日历
    c.events.add(e)
    # 按需求格式打印日志
    print(f"{current_date.strftime('%m.%d')}: {e.name}")

# 写入ics文件
with open('my.ics', 'w', encoding='utf-8') as my_file:
    my_file.write(c.serialize())
关键修改说明
  • 将Calendar()初始化移到循环外部,确保所有事件都添加到同一个日历对象中。
  • 用f"{i:03d}"将序号格式化为三位补零的字符串,满足需求同时符合Event.name的类型要求。
  • 使用strftime格式化日期为YYYY-MM-DD格式,适配ics库的日期解析规则;全天事件的end设为次日,避免部分日历应用显示异常。
  • 打印日志按MM.DD: 00X的格式输出,匹配需求示例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:23:32