Table of Contents

Progamm

KW 12

Ziele

Aufträge

Vortragsthemen

KW 11

Ziele

Aufträge

Bericht

Der Bericht soll im Minimum folgende Aspekte enthalten:

Zellformatierung

Zellformatierung in Excel: Prozent und Uhrzeit

Excel speichert Zahlen oft ganz anders, als sie uns auf dem Bildschirm angezeigt werden. In dieser kurzen Lektion findet ihr durch Ausprobieren selbst heraus, wie Excel intern mit Prozenten und Uhrzeiten rechnet. Tipp: Speichere dein Dokument regelmässig und nutze bei Bedarf Ctrl+Z (Rückgängig)!

Teil 1: Prozentdarstellung

Trage in einem leeren Arbeitsblatt in die Zellen A1 bis A3 die Werte 1, 0.5 und 25 ein. Markiert diese drei Zellen und klickt im Reiter Start auf das %-Symbol (alternativ: Rechtsklick → Zellen formatieren…Prozent).

Beobachtet das Ergebnis: Aus der 1 wird plötzlich 100%, aus 0.5 wird 50% und aus der 25 wird 2500%.

Frage: Welche Dezimalzahl musst du in eine leere Zelle eintippen, wenn du nach dem Klick auf das Prozent-Symbol exakt 25% dort stehen haben wollt? Bitte ausprobieren!

Teil 2: Wie Excel die Zeit misst

Uhrzeiten speichert Excel nicht als Stunden und Minuten, sondern als Bruchteil eines ganzen Tages. Trage dazu in eine leere Spalte die Dezimalzahlen 0, 0.5, 0.75 und 1.25 untereinander ein. Markiere die Zellen, wählt über Rechtsklick → Zellen formatieren… die Kategorie Uhrzeit und entscheide dich für ein Format, das Stunden und Minuten anzeigt (z. B. 13:30).

Das Ergebnis offenbart das interne System: 0 ist Mitternacht (00:00), 0.5 ist exakt ein halber Tag (12:00), 0.75 ist 18:00 Uhr und 1.25 springt sogar auf 06:00 Uhr am nächsten Tag.

Frage: Trage die aktuelle Uhrzeit (z.B. 14:30) in eine neue, unformatierte Zelle ein. Ändere das Format dieser Zelle über das Dropdown-Menü im Reiter Start nun zurück auf Standard. Welche Dezimalzahl kommt zum Vorschein und wie lässt sich dieser Wert mathematisch herleiten?

Frage: Wie könnte entsprechend die Zeit um eine definierte Anzahl Stunden umgerechnet werden (Zeitzonen)?

Lösung für Excel

Lösung für Excel

Die Idee ist, 9/24 (relativer Anteil von 9 Stunden an einem Tag) dazu zu addieren

KW 10

Ziele

Aufträge

Knaus' Best-of-(Excel-)Shortcuts

Alle Excel-Shortcuts finden sich in dieser Liste. Die Shortcuts bis und mit F1 funktionieren bei den meisten gängingen (Office) Applikationen.

Shortcut Beschreibung
Ctrl+Pfeil Bewegt den Cursor ans Ende des Blocks der aktiven Zelle in Richtung des Pfeils
Shift+Pfeil Markiert die Zellen in Richtung des Pfeils
Shift+Ctrl+Pfeil Markiert die Zellen in Richtungs des Pfeils bis Ende des Blocks
Ctrl+Z Letzter Schritt rückgängig machen
Ctrl+Y Letzer Schritt wiederholen (z.B. Formatierung)
F1 Hilfe
F2 Zeigt die Abhängikeiten einer Formel in der aktiven Zelle graphisch an
F4 Fixiert Zeile und Spalte, Zeile und Spalte bei erneutem Drücken
F9 Berechnet ein Arbeitsblatt neu (inkl. neuer Zufallszahl)
Ctrl+PgDn/PgUp Wechselt nach rechts/links durch die Arbeitsblätter
Ctrl+- Markierte Zeile/Spalte löschen
Ctrl++ Zeile/Spalte einfügen

KW 9

Ziele

Aufträge

Codes

Für Discord Daten

Für Discord Daten

discord_analyse_v2.py
import json
import csv
from pathlib import Path
from datetime import datetime
 
# --- CONFIGURATION ---
BASE_PATH = 'C:/temp/discord/'
OUTPUT_FILENAME = 'output_timestamps_clean.csv'
 
def standardize_timestamp(ts_string):
    """Converts varying timestamp formats into a standard YYYY-MM-DD HH:MM:SS format."""
    if not ts_string:
        return None
 
    # Format 1: "02.06.2021 06:26"
    try:
        dt = datetime.strptime(ts_string, "%d.%m.%Y %H:%M")
        return dt.strftime("%Y-%m-%d %H:%M:%S")
    except ValueError:
        pass
 
    # Format 2: "2021-02-17T20:35:29.083Z" (ISO 8601)
    try:
        dt = datetime.strptime(ts_string.replace("\"","")[:19].replace('T', ' '), "%Y-%m-%d %H:%M:%S")
 
        #dt = datetime.fromisoformat(ts_string[:17].replace('T', ' '))
        return dt.strftime("%Y-%m-%d %H:%M:%S")
    except ValueError:
        pass
 
    # Fallback: return original string if it matches neither format
    return ts_string
 
def process_file(file_path, writer):
    """Attempts to read a file as standard JSON, falls back to JSON Lines if needed."""
    with open(file_path, 'r', encoding='utf-8') as f:
        try:
            # Attempt 1: Standard JSON
            data = json.load(f)
            records = data if isinstance(data, list) else [data]
 
            for entry in records:
                if isinstance(entry, dict):
                    # Check both capitalization variants just in case
                    raw_ts = entry.get('Timestamp') or entry.get('timestamp')
                    if raw_ts:
                        clean_ts = standardize_timestamp(raw_ts)
                        writer.writerow([clean_ts, file_path.name])
            return 
 
        except json.JSONDecodeError:
            pass 
 
        # Attempt 2: JSON Lines
        f.seek(0) 
 
        for line in f:
            line = line.strip()
            if not line:
                continue
 
            try:
                entry = json.loads(line)
                records = entry if isinstance(entry, list) else [entry]
 
                for rec in records:
                    if isinstance(rec, dict):
                        raw_ts = rec.get('Timestamp') or rec.get('timestamp')
                        if raw_ts:
                            clean_ts = standardize_timestamp(raw_ts)
                            writer.writerow([clean_ts, file_path.name])
 
            except json.JSONDecodeError:
                pass
 
def extract_and_format_timestamps():
    work_dir = Path(BASE_PATH)
    output_path = work_dir / OUTPUT_FILENAME
 
    with open(output_path, 'w', newline='', encoding='utf-8') as csv_out:
        writer = csv.writer(csv_out)
        writer.writerow(['Timestamp', 'Filename'])
 
        print(f"Scanning: {work_dir}")
        print(f"Output will be saved to: {output_path}")
 
        for file_path in work_dir.glob('**/*.json'):
            if file_path.name == OUTPUT_FILENAME:
                continue
 
            try:
                process_file(file_path, writer)
            except Exception as e:
                print(f"Error reading file {file_path.name}: {e}")
 
    print("Done!")
 
if __name__ == "__main__":
    extract_and_format_timestamps()

KW 8

Ziele

Aufträge

Codes

Die untenstehende Codes dienen alle zur Aufbereitung der Daten in eine CSV-Datei. Bei allen Codes müssen die Pfade auf den eigenen Ordner angepasst werden, ebenso muss der Pfad zur CSV-Datei angepasst werden.

Die Codes für Spotify und Discord sind weniger “didaktisch”, das heisst, die sind komplizierter dafür professioneller geschrieben und weniger leicht zu verstehen. Wer möchte, kann sich entlang der Kommentare im Instagramm-Code vertiefen und gerne Fragen mit der Lehrperson besprechen.

Spotify

Für Spotify-Daten

Für Spotify-Daten

spotify_analyse.py
import json
import csv
from pathlib import Path
 
# --- CONFIGURATION ---
# Replace this with the path to your folder.
# The script will read JSONs from here AND save the CSV.
BASE_PATH = 'C:/temp/spotify/'  # <-- Change this to your actual folder path
OUTPUT_FILENAME = 'C:/temp/spotify_history.csv'
DELIM = ';'  # Delimiter for CSV, change if needed
 
 
def spotify_json_to_csv():
    # Create a Path object from the global variable
    work_dir = Path(BASE_PATH)
    output_path = OUTPUT_FILENAME
 
    # Open the CSV file for writing
    with open(output_path, 'w', newline='', encoding='utf-8') as csv_out:
        writer = csv.writer(csv_out, delimiter=DELIM)
 
        # Write the header row with the new column
        writer.writerow(['Timestamp', 'Song Title', 'Artist', 'ms_played'])
 
        print(f"Scanning: {work_dir}")
        print(f"Output will be saved to: {output_path}")
 
        # Walk through all JSON files in the directory
        for file_path in work_dir.glob('**/*.json'):
            # Skip the output file itself if it already exists to avoid errors
            if file_path.name == OUTPUT_FILENAME:
                continue
 
            try:
                with open(file_path, 'r', encoding='utf-8') as f:
                    data = json.load(f)
                    print(
                        f"Processing: {file_path.name} with {len(data)} entries")
                    if isinstance(data, list):
                        for entry in data:
                            timestamp = entry.get('ts')
                            song = entry.get('master_metadata_track_name')
                            artist = entry.get(
                                'master_metadata_album_artist_name')
                            ms_played = entry.get('ms_played', 0)
 
                            # Write row only if we have a valid song title
                            if song:
                                writer.writerow(
                                    [timestamp, song, artist, ms_played])
 
            except json.JSONDecodeError:
                print(f"Warning: Could not decode {file_path.name}")
            except Exception as e:
                print(f"Error processing {file_path.name}: {e}")
 
    print("Done!")
 
 
if __name__ == "__main__":
    spotify_json_to_csv()
Discord

Für Discord Daten

Für Discord Daten

discord_analyse.py
import json
import csv
from pathlib import Path
 
# --- CONFIGURATION ---
# Replace this with the path to your folder.
# The script will read JSONs from here AND save the CSV here.
BASE_PATH = 'C:/temp/discord/'
OUTPUT_FILENAME = 'C:/temp/output_timestamps.csv'
DELIM = ';'  # Delimiter for CSV, change if needed
 
def json_to_csv():
    # Create a Path object from the global variable
    work_dir = Path(BASE_PATH)
    output_path = OUTPUT_FILENAME
 
    # Open the CSV file for writing
    with open(output_path, 'w', newline='', encoding='utf-8') as csv_out:
        writer = csv.writer(csv_out,delimiter=DELIM)
 
        # Write the header row
        writer.writerow(['Timestamp', 'Filename'])
 
        print(f"Scanning: {work_dir}")
        print(f"Output will be saved to: {output_path}")
 
        # Walk through all JSON files
        for file_path in work_dir.glob('**/*.json'):
            try:
                with open(file_path, 'r', encoding='utf-8') as f:
                    data = json.load(f)
 
                    # Ensure the structure is a list
                    if isinstance(data, list):
                        for entry in data:
                            timestamp = entry.get('Timestamp')
 
                            # Write row only if timestamp exists
                            if timestamp:
                                writer.writerow([timestamp, file_path.name])
 
            except json.JSONDecodeError:
                print(f"Warning: Could not decode {file_path.name}")
            except Exception as e:
                print(f"Error processing {file_path.name}: {e}")
 
    print("Done!")
 
if __name__ == "__main__":
    json_to_csv()
Instagram

Für Daten im Format März 27, 2023 9:34 pm

Für Daten im Format März 27, 2023 9:34 pm

insta_analyse_deutsch.py
# -*- coding: utf-8 -*-
import re        # Regular Expressions
import datetime  # Datum/Zeit
import os        # Files suchen
 
# Erklärungen zu diesem Code sind bei der Lehrperson erhältlich. Es ist nicht nötig, diesen Code zu verstehen, um die Aufgabe zu lösen. Es könnte aber interessant sein, sich damit zu beschäftigen.
 
rootdir = 'C:/ordner/wo/alles/liegt/'
pathtocsv = 'C:/order/wo/das/resultat/sein/soll/dateiname.csv'
mnum = {
    "Januar": 1, "Februar": 2, "März": 3, "April": 4, "Mai": 5, "Juni": 6,
    "Juli": 7, "August": 8, "September": 9, "Oktober": 10, "November": 11, "Dezember": 12
}
 
# Resultat, das am Schluss geschrieben werden soll
csv = ""   # Comma separated values
# Wie viele Kontrollausgaben?
debug = 10
 
# Alle HTML-Dateien im Verzeichnis anzeigen
for root, dirs, files in os.walk(rootdir):
    for file in files:
        if file.endswith(".html"):
            filepath = os.path.join(root, file)
            # Datei oeffnen
            f = open(filepath, "r", encoding="utf8")
            html = f.read()  # Alles einlesen
            f.close()        # Datei schliessen
 
            # Datum der Form Apr. 08, 2021 8:54 am einlesen
            # Alle nötigen Angaben werden in Klammern "ge-captured"
            daten = re.findall(
                "([A-Z][a-zä]+) (\d{1,2}), (\d{4}) (\d{1,2}):(\d{1,2}) ([ap]m)", html)
 
            if (debug > 0):
                print(file, ": ", len(daten))
                debug -= 1
 
            # Alle Einträge durchgehen, d enthält jeweils den nächsten Eintrag
            for d in daten:
                # Einträge in Zahlen umwandeln
                # Monat plus die anderen Einträge (ohne AM/PM) in Zahlen umgewandelt
                #   Die Zeichenkette "42" ist nicht das gleiche wie die Zahl 42.
                e = [mnum[d[0]]] + [int(x) for x in d[1:-1]]
                # Nachmittag? Plus 12 Stunden (Ausser Mitternacht = 0)
                if d[5] == "pm":
                    e[3] = (e[3]+12) % 24
                if debug > 0:
                    # Ausgabe zur Kontrolle, sollte folgendes Format Produzieren
                    print(e)  # [1, 6, 2021, 21, 23, 12]
                    debug -= 1  # Um 1 vermindern
 
                # Datum daraus generieren (macht die Datumsmanipulation einfacher).
                # Jahr, Monat, Tag, Stunde, Minute, Sekunde
                datum = datetime.datetime(e[2], e[0], e[1], e[3], e[4], 0)
 
                if debug > 0:
                    # Ausgabe zur Kontrolle, produziert folgendes Format
                    print(datum)   # 2021-01-06 21:23:12
                    debug -= 1  # Um 1 vermindern
 
                # Wochentag (Mo=0, Di=1, ..., So=6)
                # Sämtliche Methoden für datetime-Objekte sind hier beschrieben: https://docs.python.org/3/library/datetime.html#datetime-objects
                wday = datum.weekday()
 
                # Formatierte Ausgabe des Datums, siehe https://www.w3schools.com/python/python_datetime.asp
                # \n heisst neue Zeile.
                # Das Format soll so angepasst werden, damit die Tabellenkalkulation dann damit umgehen kann.
                csv += datum.strftime("%Y-%m-%d %H:%M:%S;" + os.path.splitext(file)[0]+"\n")
 
        # Ausgabe in Datei schreiben
        f = open(pathtocsv, "w")
        f.write(csv)
        f.close()

Für Daten im Format Jun 27, 2023 9:34 pm

Für Daten im Format Jun 27, 2023 9:34 pm

insta_analyse_english.py
import re        # Regular Expressions
import datetime  # Datum/Zeit
import os        # Files suchen
 
# Erklärungen zu diesem Code sind bei der Lehrperson erhältlich. Es ist nicht nötig, diesen Code zu verstehen, um die Aufgabe zu lösen. Es könnte aber interessant sein, sich damit zu beschäftigen.
 
rootdir = 'C:/ordner/wo/alles/liegt/'
pathtocsv = 'C:/order/wo/das/resultat/sein/soll/dateiname.csv'
mnum = {"Jan": 1, "Feb": 2, "Mar": 3, "Apr": 4, "May": 5, "Jun": 6,
        "Jul": 7, "Aug": 8, "Sep": 9, "Oct": 10, "Nov": 11, "Dec": 12}
 
# Resultat, das am Schluss geschrieben werden soll
csv = ""   # Comma separated values
# Wie viele Kontrollausgaben?
debug = 10
 
# Alle HTML-Dateien im Verzeichnis anzeigen
for root, dirs, files in os.walk(rootdir):
    for file in files:
        if file.endswith(".html"):
            filepath = os.path.join(root, file)
            # Datei oeffnen
            f = open(filepath, "r", encoding="utf8")
            html = f.read()  # Alles einlesen
            f.close()        # Datei schliessen
 
            # Datum der Form Apr. 08, 2021 8:54 am einlesen
            # Alle nötigen Angaben werden in Klammern "ge-captured"
            daten = re.findall(
                "([A-Z][a-z][a-z])\.? (\d{1,2}), (\d{4}) (\d{1,2}):(\d{1,2}) ([ap]m)", html)
 
            if (debug > 0):
                print(file, ": ", len(daten))
                debug -= 1
 
            # Alle Einträge durchgehen, d enthält jeweils den nächsten Eintrag
            for d in daten:
                # Einträge in Zahlen umwandeln
                # Monat plus die anderen Einträge (ohne AM/PM) in Zahlen umgewandelt
                #   Die Zeichenkette "42" ist nicht das gleiche wie die Zahl 42.
                e = [mnum[d[0]]] + [int(x) for x in d[1:-1]]
                # Nachmittag? Plus 12 Stunden (Ausser Mitternacht = 0)
                if d[5] == "pm":
                    e[3] = (e[3]+12) % 24
                if debug > 0:
                    # Ausgabe zur Kontrolle, sollte folgendes Format Produzieren
                    print(e)  # [1, 6, 2021, 21, 23, 12]
                    debug -= 1  # Um 1 vermindern
 
                # Datum daraus generieren (macht die Datumsmanipulation einfacher).
                # Jahr, Monat, Tag, Stunde, Minute, Sekunde
                datum = datetime.datetime(e[2], e[0], e[1], e[3], e[4], 0)
 
                if debug > 0:
                    # Ausgabe zur Kontrolle, produziert folgendes Format
                    print(datum)   # 2021-01-06 21:23:12
                    debug -= 1  # Um 1 vermindern
 
                # Wochentag (Mo=0, Di=1, ..., So=6)
                # Sämtliche Methoden für datetime-Objekte sind hier beschrieben: https://docs.python.org/3/library/datetime.html#datetime-objects
                wday = datum.weekday()
 
                # Formatierte Ausgabe des Datums, siehe https://www.w3schools.com/python/python_datetime.asp
                # \n heisst neue Zeile.
                # Das Format soll so angepasst werden, damit die Tabellenkalkulation dann damit umgehen kann.
                csv += datum.strftime("%Y-%m-%d %H:%M:%S;" + os.path.splitext(file)[0]+"\n")
 
        # Ausgabe in Datei schreiben
        f = open(pathtocsv, "w")
        f.write(csv)
        f.close()

KW 7

Ziele

Aufträge

Click to display ⇲

Click to hide ⇱

insta_analyse.py
import os
 
# --- Programm um alle Dateien zu durchlaufen---
# Pfad anpassen
folder_to_check = 'C:/ordner/wo/alles/liegt/' #Achtung: Forward slashes oder ein r vor dem String
 
def get_directory_size(start_path):
    total_size = 0
 
    # os.walk() generates the file names in a directory tree
    # It yields a 3-tuple (dirpath, dirnames, filenames)
    for dirpath, dirnames, filenames in os.walk(start_path):
        for f in filenames:
            # Join the directory path and file name to get the full path
            fp = os.path.join(dirpath, f)
            print(fp)
            # Skip if it is a symbolic link (optional, but good practice)
            if not os.path.islink(fp):
                total_size += os.path.getsize(fp)
 
    return total_size
 
 
 
print(f"Berechne Grösse für: {os.path.abspath(folder_to_check)}")
 
size_in_bytes = get_directory_size(folder_to_check)
 
# Convert to Megabytes for easier reading
size_in_mb = size_in_bytes / (1024 * 1024)
 
print(f"Gesamtgrösse: {size_in_bytes} bytes")
print(f"Gesamtgrösse: {size_in_mb:.2f} MB")

Dokumentation

Begriff Eintrag
CSV Dokumentiere, was CSV [ist], wie es angezeigt und bearbeitet werden kann. Erstelle eine CSV-Datei mit Notepad und betrachte sie in Excel.
Code erklären (KW 8) Erklären, was der Code macht, allenfalls unter Zuhilfenahme von KI.
CSV vs. Excel & Basics (KW 9) Unterschied CSV und Excel-Datei ist notiert, Zellreferenzen und Filter sind erklärt, die wichtigsten Tastaturshortcuts sind ebenfalls angefügt.
Pivottabellen & Funktionen (KW 10) Was sind Pivottabellen? Wie funktioniert die Funktion “WOCHENTAG”? Welches sind nützliche Short-cuts in Excel?
Zellformatierung (KW 11) Verschiedene Zellformatierungen sind erklärt. Welche Datentypen können wie formatiert werden.
Word, PDF & Grafikformate (KW 12) Unterschied Word und PDF. Welche Grafikformate sollen wann verwendet werden? Wieso?