Beitrag

6. Okt. 2023

Simpler Time Tracker mit SQLite

Seit langem suche ich etwas, wo ich meine Aufgaben und Kommentare + Zeit sauber hinterlegen kann. Gerade im Datenverarbeitungsbereich möchte ich irgendwann eine saubere Auflistung aller Tasks die über die Monate, Jahre etc. angefallen sind. Nun habe ich Zeitlangs eine Obisdian Tabelle geführt, eher schlecht als recht. Zwar konnte ich da alles schön hinterlegen und aufarbeiten, aber am Ende fallen die Daten dann in ein Loch und richtig auswertbar ist das auch nicht. Dann kommt Excel – schön und gut, aber das XLS Format ist nicht sehr robust. Daher musste was einfaches her. Für eine große Datenbank ist es zuviel, daher die Entscheidung auf SQLite. Der Aufbau ist relativ simpel gehalten. Zugriff erfolgt via DataGrip aber es gibt hier sicherlich genug alternative und GUI die einen Zugriff erlauben. Schema ist weitgehends einfach:

create table main.worktime
(
year integer not null,
month integer not null,
day integer,
task TEXT not null,
code_comments TEXT,
status TEXT,
task_time REAL not null
);

Auswertung erfolgt über JupyterLab (das Skript wurde mit Hilfe von ChatGPT erstellt um mal die Plus Variante zu testen). Hinzugefügt wurden das Datum und die Wochenauswertung:

# Importing SQLite and other required libraries
import sqlite3
import matplotlib.pyplot as plt
import pandas as pd
from datetime import datetime, timedelta
# Connect to SQLite database or create one if it doesn't exist
conn = sqlite3.connect("TimeTracker.sqlite")


# Function to generate reports from the SQLite database
def generate_reports(year=None, month=None, day=None, weekly=False):
    query = "SELECT * FROM main.worktime WHERE 1=1"
    params = []
    
    if weekly:
        today = datetime.now()
        start_week = today - timedelta(days=today.weekday())  # Monday of the current week
        end_week = start_week + timedelta(days=6)  # Sunday of the current week
        year = start_week.year
        month = start_week.month
        query += f" AND (date(year || '-' || month || '-' || day) BETWEEN date('{start_week.date()}') AND date('{end_week.date()}'))"
    
    elif year:
        query += " AND year = ?"
        params.append(year)
    if month:
        query += " AND month = ?"
        params.append(month)
    if day:
        query += " AND day = ?"
        params.append(day)
    
    df = pd.read_sql_query(query, conn, params=params)
    if df.empty:
        print("No data available for the selected date range.")
        return

    if weekly:
        title = f"Weekly Report for the current week starting from {start_week.date()}"
    elif day:
        title = f"Daily Report for {year}-{month}-{day}"
    elif month:
        title = f"Monthly Report for {year}-{month}"
    else:
        title = f"Yearly Report for {year}"
    
    summary = df.groupby('task')['task_time'].sum().reset_index()
    
    plt.figure(figsize=(10, 6))
    plt.bar(summary['task'], summary['task_time'], color='blue')
    plt.xlabel('Task')
    plt.ylabel('Time Spent (hours)')
    plt.title(title)
    plt.xticks(rotation=45)
    plt.show()

# Uncomment the following lines to generate reports in your Jupyter Lab 
current_date = datetime.now()
default_year = current_date.year
default_month = current_date.month
default_day = current_date.day

generate_reports(default_year)  # Yearly report for 2023
generate_reports(default_year, default_month)  # Monthly report for October 2023
generate_reports(default_year, default_month, default_day)  # Daily report for 2023-10-06
generate_reports(weekly=True)

Für die schnelle Erfassung ein schönes Tool. Mal sehen wie sich das bewährt.

Hintergrund Info: https://dannb.org/blog/2022/obsidian-daily-note-template/

0 Teilen

Antwort schreiben

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert