Sleep Pattern Analyzer Python Script

A Python script to track your sleep patterns by logging bed and wake times, and rate your sleep quality. Get insights like average sleep hours, best sleep nights, and view sleep data for any specific date.

Click to view script…
import json
import os
from datetime import datetime, timedelta

# Load existing entries from the JSON file
if os.path.exists("sleep_log.json"):
    with open("sleep_log.json", "r") as f:
        entries = json.load(f)
else:
    entries = []

# Ask the user what they want to do
action = input("Do you want to (1) record a new sleep entry, (2) look up sleep statistics, or (3) view sleep data for a specific date? Enter 1, 2, or 3: ").strip()

if action == "1":
    # Record a new sleep entry
    date_input = input("Enter the date (YYYY-MM-DD) or press enter for today: ").strip()
    if date_input == "":
        date = datetime.now().strftime("%Y-%m-%d")
    else:
        date = date_input  # Assuming correct input for simplicity

    bed_time = input("Enter bed time (HH:MM): ").strip()
    wake_time = input("Enter wake time (HH:MM): ").strip()
    
    while True:
        try:
            quality = int(input("Enter quality rating (1-5): "))
            if 1 <= quality <= 5:
                break
            else:
                print("Please enter a number between 1 and 5.")
        except ValueError:
            print("Invalid input. Please enter an integer.")
    
    # Calculate hours slept
    bed_dt = datetime.strptime(date + " " + bed_time, "%Y-%m-%d %H:%M")
    wake_dt = datetime.strptime(date + " " + wake_time, "%Y-%m-%d %H:%M")
    if wake_dt < bed_dt:
        wake_dt += timedelta(days=1)
    hours_slept = (wake_dt - bed_dt).total_seconds() / 3600
    
    new_entry = {
        "date": date,
        "bed_time": bed_time,
        "wake_time": wake_time,
        "hours_slept": hours_slept,
        "quality": quality
    }
    entries.append(new_entry)
    
    with open("sleep_log.json", "w") as f:
        json.dump(entries, f, indent=4)
    
    print(f"Sleep recorded: {hours_slept:.2f} hours with quality {quality}")
    
    if len(entries) > 1:
        prev_entry = entries[-2]
        diff = hours_slept - prev_entry["hours_slept"]
        if diff > 0:
            print(f"You slept {diff:.2f} hours more than the previous night.")
        elif diff < 0:
            print(f"You slept {-diff:.2f} hours less than the previous night.")
        else:
            print("You slept the same number of hours as the previous night.")

elif action == "2":
    # Look up sleep statistics
    if not entries:
        print("No sleep entries found. Please record a sleep entry first.")
    else:
        # Calculate overall average sleep hours
        total_hours = sum(entry["hours_slept"] for entry in entries)
        avg_hours = total_hours / len(entries)
        print(f"Overall average sleep hours: {avg_hours:.2f} hours")
        
        # Average sleep hours in the last 7 days
        today = datetime.now()
        last_7_days = [entry for entry in entries if (today - datetime.strptime(entry["date"], "%Y-%m-%d")).days < 7]
        if last_7_days:
            avg_last_7 = sum(entry["hours_slept"] for entry in last_7_days) / len(last_7_days)
            print(f"Average sleep hours in the last 7 days: {avg_last_7:.2f} hours")
        else:
            print("No entries in the last 7 days.")
        
        # Best night's sleep (longest hours)
        best_hours_entry = max(entries, key=lambda x: x["hours_slept"])
        print(f"Best night's sleep: {best_hours_entry['hours_slept']:.2f} hours on {best_hours_entry['date']}")
        
        # Best quality sleep (highest rating)
        best_quality_entry = max(entries, key=lambda x: x["quality"])
        print(f"Best quality sleep: rating {best_quality_entry['quality']} on {best_quality_entry['date']}")

elif action == "3":
    # View sleep data for a specific date
    if not entries:
        print("No sleep entries found. Please record a sleep entry first.")
    else:
        user_date = input("Enter the date to look up (YYYY-MM-DD): ").strip()
        matching_entries = [entry for entry in entries if entry['date'] == user_date]
        
        if matching_entries:
            print(f"\nSleep data for {user_date}:")
            for entry in matching_entries:
                print(f"- Bed time: {entry['bed_time']}")
                print(f"  Wake time: {entry['wake_time']}")
                print(f"  Hours slept: {entry['hours_slept']:.2f}")
                print(f"  Quality: {entry['quality']}")
        else:
            print(f"No sleep entries found for {user_date}.")

else:
    print("Invalid choice. Please run the script again and enter 1, 2, or 3.")