{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Hintergrund\n", "Siehe den [Blogeintrag](http://datenspieler.com/Kalender) zu Idee und Hintergrund dieses Notebooks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Package [`icalenar`](http://icalendar.readthedocs.io/en/latest/) wird benötigt, um ics Files zu erzeugen." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import icalendar\n", "import datetime\n", "import os" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`anzahl_wochen` gibt an, für wieviele Wochen es Kalendereinträge geben soll, z.B.: *Lukas: 25 W*. Analog für `anzahl_monate` und `anzahl_jahre`." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "anzahl_wochen = 25\n", "anzahl_monate = 24\n", "anzahl_jahre = 99" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Zusätzlich kann man noch besondere Tage angeben, an denen *Julia* z.B. 1000 Tage alt ist." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Tausend Tage sind grob 3 Jahre, somit 30000 Tage rund 90 Jahre\n", "besondere_tage = (100, 200, 500, 1000, 2000, 5000, 10000, 20000, 30000)\n", "besondere_tage = besondere_tage + (3333, 11111, 22222, 33333)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hier werden die Personen und ihre Geburtstage eingegeben." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "geburtstage = {'Lukas': datetime.date(2016,3,3), \n", " 'Julia': datetime.date(2015,12,12)}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nun wird ein Dictionary erzeugt, das für jede Person die Einträge mit den entsprechenden Tagen enthält." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Dictionary für Kalendereinträge\n", "eintraege = dict()\n", "\n", "for name in geburtstage:\n", " geburtstag = geburtstage[name]\n", "\n", " # Geburtstag\n", " eintraege['{name}: Geburtstag'.format(name=name, geburtstag=geburtstag)] = geburtstag\n", "\n", " # Ersten Wochen\n", " for nr_wochen in range(1,anzahl_wochen+1):\n", " text = '{name}: {nr_wochen:02d} W'.format(name=name, nr_wochen=nr_wochen)\n", " eintraege[text] = geburtstag + datetime.timedelta(weeks=nr_wochen)\n", "\n", " # Ersten Monate\n", " for nr_monate in range(1,anzahl_monate+1):\n", " text = '{name}: {nr_monate:02d} M'.format(name=name, nr_monate=nr_monate)\n", " monat = (geburtstag.month -1 + nr_monate) % 12 + 1\n", " jahr = geburtstag.year + ((( geburtstag.month - 1) + nr_monate ) // 12 )\n", " # Für 12 Monate, 24 Monate, ... soll kein Eintrag erstellt werden\n", " if monat != geburtstag.month:\n", " eintraege[text] = datetime.date(jahr, monat, geburtstag.day)\n", "\n", " # Geburtstage \n", " for nr_jahre in range(1,anzahl_jahre+1):\n", " text = '{name}: {nr_jahre:02d} J'.format(name=name, nr_jahre=nr_jahre)\n", " eintraege[text] = datetime.date(geburtstag.year + nr_jahre, geburtstag.month, geburtstag.day)\n", "\n", " # besondere Tage\n", " for tage in besondere_tage:\n", " text = '{name}: {tage} Tage'.format(name=name, tage=tage)\n", " eintraege[text] = geburtstag + datetime.timedelta(days = tage)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`eintraege` enthält nun z.B.:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "datetime.date(2016, 3, 3)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eintraege['Lukas: Geburtstag']" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "datetime.date(2016, 3, 21)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eintraege['Julia: 100 Tage']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Einträge, die in der Vergangenheit liegen, werden nun herausgefiltert. Sprich es werden nur zukünftige Einträge in das Kalenderfile geschrieben. Falls man doch auch vergangene Einträge im Kalender haben will, diese Zelle einfach nicht ausführen." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Anzahl Einträge insgesamt: 320\n", "Anzahl Einträge in der Zukunft: 281\n" ] } ], "source": [ "print('Anzahl Einträge insgesamt: ', len(eintraege))\n", "\n", "eintraege = {text: eintraege[text] for text in eintraege if eintraege[text] > datetime.date.today()}\n", "\n", "print('Anzahl Einträge in der Zukunft: ', len(eintraege))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nun wird das Kalenderfile mit Hilfe von `icalendar` erzeugt, ..." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [], "source": [ "cal = icalendar.Calendar()\n", "cal.add('prodid', 'Geburtstags-Kalender')\n", "cal.add('version', '2.0')\n", "\n", "for text in eintraege:\n", "# print(text, '---', eintraege[text])\n", " event = icalendar.Event()\n", " event.add('summary', text)\n", " event.add('dtstart', eintraege[text])\n", " event.add('dtend', eintraege[text])\n", " cal.add_component(event) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "... gespeichert ..." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "f = open('Kalender.ics', 'wb')\n", "f.write(cal.to_ical())\n", "f.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "... und ein Download-Link erzeugt:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "Kalender.ics
" ], "text/plain": [ "C:\\Users\\uniqu\\Documents\\git\\datenspieler.github.io\\notebooks\\2016-kalender\\Kalender.ics" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import FileLink\n", "FileLink('Kalender.ics')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }