← 返回信息流
AI 资讯Hacker News·2 天前

个性化垃圾分类日历帮你生活更环保

原标题:Creating a Personalised Bin Calendar

速览

这项个性化垃圾分类日历通过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 标准库即可实现可视化定制。作者通过少量代码+手动修改,实现了从繁杂全郡信息到“只看自家街道”的转变,不仅节省了大量时间,还让生活规划更加精准与自主。

在日常生活中,这份冰箱贴日历已成为作者的“生活习惯监测器”,帮助他合理控制垃圾桶使用频率(跳过半箱情况),避免不必要的资源浪费。类似方法完全可扩展到其他需要精确日期追踪的场景(如会议提醒、礼仪日历等),证明了即使是最普通的技术工具,只要稍作定制,便能带来显著的生活品质提升。无论在英国还是全球,这种“用代码解决实际痛点”的理念,都值得更多开发者在闲暇时尝试,让生活每一天都更加贴心。

查看原文 →alexwlchan.net