使用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'
错误原因
- 事件名称类型错误:
ics库的Event.name要求是字符串类型,但原代码中直接赋值了整数i,导致序列化时调用字符串方法replace失败,触发AttributeError。 - Calendar对象重复创建:循环内每次都新建
Calendar(),导致之前添加的事件被覆盖,最终只会写入最后一天的事件。 - 日期格式与序号格式不符合需求:原代码输出的日期是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
相关产品推荐
相关产品推荐

