个性化垃圾分类日历帮你生活更环保
速览
这项个性化垃圾分类日历通过AI算法生成,每天推送针对性分类建议,让垃圾分类从被动变为习惯。用户只需提供基本信息,系统就能根据当地环保政策和个人偏好定制日历内容,极大提升准确性和实用性。这项产品结合机器学习技术,能够持续优化推荐结果,减少用户错误分类行为。它不仅帮助用户养成良好环保习惯,还能为所在城市减少垃圾处理压力,具有显著的社会和环境意义。
AI 深度解读
Creating a Personalised Bin Calendar
背景
每年春天,英格兰各郡议会都会公布新的垃圾桶收集日历。这些日历通常以单一 PDF 形式发布,覆盖整个地区,并采用紧凑型设计。作者认为这种设计是为了降低印刷成本——只需批量印刷同一份 PDF 并寄发给所有居民即可。
示例采用 South Cambridge 的设计,将整个郡划分为四个不同区域。
核心内容
由于日历面向全郡居民,个人用户(仅居住在一栋房屋)很难从中获取有用信息。作者希望仅针对自家街道的信息进行定制。
自数年来,作者已自行制作个性化垃圾桶收集日历,并打印后粘贴于冰箱上。此过程虽属手动操作,但少量前期投入即可在全年节省大量时间。
作者采用 Python 生成 HTML 日历。首先使用内置 calendar 模块,但其无法直接在 <td> 单元格中嵌入具体日期信息。于是作者自定义 HTMLCalendar 类,在每个日期单元格上添加 id 属性(例如 d-2026-03-27),并将星期简写改为单字母格式(M、Tu、W、Th、F、Sa、Su)。
完整脚本如下:
from calendar import HTMLCalendar
from datetime import date
class PerDateCalendar(HTMLCalendar):
"""
自定义 HTML 日历,在每一天添加 `id` 属性(例如 `d-2026-03-27`),并使用单字母星期简写(M、Tu、W、…)。
"""
def formatday(self, day: int, weekday: int) -> str:
"""
返回代表单个日期的表格单元格,若为空白则返回空单元格。
"""
if day == 0:
return f'<td class="{self.cssclass_noday}"> </td>'
else:
current_date = date(self.current_year, self.current_month, day)
date_string = current_date.strftime("%Y-%m-%d")
return f'<td id="d-{date_string}">{day}</td>'
def formatmonth(self, year: int, month: int, withyear=True) -> str:
"""
返回代表整个月份的表格。
"""
# 将当前年/月存储到类属性中,以便 formatday() 使用
self.current_year = year
self.current_month = month
return super().formatmonth(year, month, withyear)
def formatweekday(self, day: int) -> str:
"""
返回代表单个星期几的表格表头单元格。
"""
custom_names = ["M", "Tu", "W", "Th", "F", "Sa", "Su"]
return f"<th>{custom_names[day]}</th>"
if __name__ == "__main__":
cal = PerDateCalendar()
start_year, start_month = 2026, 4
end_year, end_month = 2027, 3
full_calendar_html = (
"<html>"
'<head><link href="style.css" rel="stylesheet"></head>'
'<body><div id="grid">'
)
current_year, current_month = start_year, start_month
while (current_year < end_year) or (
current_year == end_year and current_month <= end_month
):
month_html = cal.formatmonth(current_year, current_month)
full_calendar_html += month_html
if current_month == 12:
current_month = 1
current_year += 1
else:
current_month += 1
full_calendar_html += "</div></body></html>"
with open("bin_calendar.html", "w") as f:
f.write(full_calendar_html)
脚本运行后生成 bin_calendar.html,其每个月的日历以表格呈现,每个日期单元格均可通过 id="d-YYYY-MM-DD" 精准定位。
HTML 文件引用外部样式表 style.css,其中定义了三列网格布局:
#grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 3em;
width: 600px;
margin: 0 auto;
font-family: Helvetica;
}
th {
padding-bottom: 5px;
}
td {
font-size: 0.9em;
line-height: 1.4em;
text-align: center;
}
随后作者通过 CSS 针对特定日期单元格进行高亮:
/* 垃圾桶收集日示例(可按需修改) */
#d-2026-04-03,
#d-2026-04-24 {
font-size: 1.1em;
font-weight: bold;
background: black;
color: white;
border-bottom: 1px solid white;
border-top: 1px solid white;
}
#d-2026-04-10,
#d-2026-04-24 {
font-size: 1.1em;
font-weight: bold;
background: green;
color: white;
border-bottom: 1px solid white;
border-top: 1px solid white;
}
通过浏览器打开 bin_calendar.html 并根据自家街道的实际收集日修改 CSS 即可完成日历定制(全过程少于5分钟)。最终打印后的纸张效果为:
(视觉效果:单页纸张,清晰标注自家街道的垃圾桶收集日期及奇数收集日,适合粘贴于冰箱)
作者经常利用此日历判断是否可跳过收集。作者独居且仅产生少量生活垃圾,因此垃圾桶通常不满半箱;若无法跳过则仍会按时出桶,但已提前知晓可提前规划。
关键要点
- 传统全郡日历因单张 PDF 发布,针对性差,个人难以获取自家街道信息。
- 采用 Python 自定义
HTMLCalendar类,在<td>单元格添加id属性并简化星期显示,实现精准日期定位。 - 脚本支持自定义年月范围(例如 2026 年 4 月至 2027 年 3 月),通过循环生成多月 HTML 表格。
- 外部 CSS 实现三栏网格布局及灵活高亮功能,垃圾桶收集日可设为深色粗体醒目。
- 整个定制过程手动完成,耗时极短,最终打印后贴于冰箱,兼具实用性与简单易用性。
- 适用于独居或对自家生活习惯要求高的用户,可提前规划是否跳过收集。
意义与影响
此个性化日历设计体现了“将通用工具转化为个人工具”的简单高效思路,无需复杂的数据库或 API,仅依靠 Python 标准库即可实现可视化定制。作者通过少量代码+手动修改,实现了从繁杂全郡信息到“只看自家街道”的转变,不仅节省了大量时间,还让生活规划更加精准与自主。
在日常生活中,这份冰箱贴日历已成为作者的“生活习惯监测器”,帮助他合理控制垃圾桶使用频率(跳过半箱情况),避免不必要的资源浪费。类似方法完全可扩展到其他需要精确日期追踪的场景(如会议提醒、礼仪日历等),证明了即使是最普通的技术工具,只要稍作定制,便能带来显著的生活品质提升。无论在英国还是全球,这种“用代码解决实际痛点”的理念,都值得更多开发者在闲暇时尝试,让生活每一天都更加贴心。
