scoopydoo 发表于 2025-1-31 23:30:54

[折腾] [Python] 给儿子打印课程表,顺便统计课时

本帖最后由 scoopydoo 于 2025-1-31 23:54 编辑

刚刚过完中国年儿子就开学了,正式成为了一名中学生。

学校门户网站上可以查到儿子的课程表,领导指示俺打一份出来塑封好,让儿子带到学校去。

网站上的课程表设计的很漂亮,但是对比度不高、色彩也很繁杂,俺就把它复制下来重新制表打了一份。

出于职业习惯(病),顺手写了一段代码统计各门课程的时间分配,画了个饼形图,一目了然哈。

import openpyxl
import datetime
import matplotlib.pyplot

def calc_period_length(time_str):
    # Split the string into start and end times
    start_time_str, end_time_str = time_str.split(" – ")
    # Define the format of the input time strings
    time_format = "%I:%M%p"
    # Parse the start and end times into datetime objects
    start_time = datetime.datetime.strptime(start_time_str, time_format)
    end_time = datetime.datetime.strptime(end_time_str, time_format)
    # Calculate the difference in minutes
    time_difference = end_time - start_time
    return int(time_difference.total_seconds() / 60)

# Function to add a value to a dictionary
def add_value(dictionary, key, value):
    if key in dictionary:
      dictionary += value
    else:
      dictionary = value

MY_FILE = '/mnt/c/Users/gamal/Documents/Timetable for Year 7.xlsx'
NUMBER_OF_PERIODS = 8

# There is only one sheet in the workbook
ws = openpyxl.load_workbook(MY_FILE).active

# Dictionary of accumulated time for each subject
accumulated = {}

for period in range(NUMBER_OF_PERIODS):
    period_length = calc_period_length(ws.value)

    # 5 school days in column 'B' to 'F'
    for day_column in 'BCDEF':
      subject = ws.value
      add_value(accumulated, subject, period_length)

# Sort the results
accumulated = dict(sorted(accumulated.items(), key = lambda item: item))

# Extract the labels and values from the dictionary
labels = list(accumulated.keys())
values = list(accumulated.values())

# Create a pie chart
TITLE_OF_CHART = 'Subject Time Allocation'
matplotlib.pyplot.figure(figsize=(8, 8))
matplotlib.pyplot.pie(values, labels = labels, autopct = '%1.1f%%', startangle = 140)
matplotlib.pyplot.title(TITLE_OF_CHART)
matplotlib.pyplot.show()

JuncoJet 发表于 2025-1-31 23:41:36

这怕是交不了差
和美观八竿子打不着

girlexplorer 发表于 2025-1-31 23:42:18

本帖最后由 girlexplorer 于 2025-1-31 23:46 编辑

老衲不懂python,看不懂楼上的代码,请AI帮忙:

请问以下这段代码的功能

(代码略)

AI的回答如下:

这段代码的功能是读取一个Excel文件中的时间表,计算每个科目在8个课时周期内的总上课时间,并生成一个饼图来显示这些时间分配。

具体步骤如下:

1. **导入必要的库**:
   - `openpyxl`:用于处理Excel文件。
   - `datetime`:用于处理日期和时间。
   - `matplotlib.pyplot`:用于创建图表。

2. **定义函数 `calc_period_length(time_str)`**:
   - 该函数接受一个包含开始时间和结束时间的字符串,计算它们之间的分钟差,并返回这个差值(以整数形式)。

3. **定义函数 `add_value(dictionary, key, value)`**:
   - 该函数用于向字典中添加键和对应的值。如果键已经存在,则将值累加到现有值上;否则,创建新的键并赋值为给定的值。

4. **加载Excel文件并获取活动工作表**:
   - 使用 `openpyxl.load_workbook(MY_FILE).active` 加载指定路径下的Excel文件,并获取其中的第一个(默认)工作表。

5. **初始化一个字典 `accumulated`**:
   - 用于存储每个科目在8个课时周期内的总上课时间。

6. **遍历每个课时周期**:
   - 对于每个课时周期,调用 `calc_period_length(ws.value)` 计算该周期的总上课时间。
   - 遍历从 'B' 到 'F' 的列(代表5个学校日),获取对应科目的名称,并使用 `add_value` 函数将计算得到的时间累加到字典中。

7. **对字典进行排序**:
   - 使用 `dict(sorted(accumulated.items(), key = lambda item: item))` 对字典按时间分配的总分钟数进行降序排序。

8. **提取标签和值**:
   - 从排序后的字典中提取科目名称(labels)和对应的时间分配(values)。

9. **创建饼图并显示**:
   - 使用 `matplotlib.pyplot.pie` 创建一个饼图,其中 `autopct='%1.1f%%'` 表示百分比格式保留一位小数。
   - 设置图表标题为 'Subject Time Allocation' 并使用 `matplotlib.pyplot.show()` 显示图表。

总结来说,这段代码的主要功能是通过Excel文件中的时间表数据计算每个科目在8个课时周期内的总上课时间,并生成一个饼图来展示这些时间分配。

scoopydoo 发表于 2025-1-31 23:54:34

JuncoJet 发表于 2025-1-31 23:41
这怕是交不了差
和美观八竿子打不着

不在乎美观,只要清楚就行,原来网站的配色不容易看清。 :lol

scoopydoo 发表于 2025-1-31 23:55:00

girlexplorer 发表于 2025-1-31 23:42
老衲不懂python,看不懂楼上的代码,请AI帮忙:

请问以下这段代码的功能


AI 干这个简直是易如反掌啊! :lol

hgb 发表于 2025-2-1 09:37:19

不是国内上学?全都是英文呢

量子隧道 发表于 2025-2-1 09:41:47

澳洲居然有“满大人”课。是针对天朝移民的设置的课,还是袋鼠国的中学生都可以学(只要愿意并且申请)?

scoopydoo 发表于 2025-2-1 11:37:03

hgb 发表于 2025-2-1 09:37
不是国内上学?全都是英文呢

人在澳洲呢 :lol

zhengrob 发表于 2025-2-1 11:47:04

这中文课竟然占到并列第3的位置

scoopydoo 发表于 2025-2-1 11:48:29

量子隧道 发表于 2025-2-1 09:41
澳洲居然有“满大人”课。是针对天朝移民的设置的课,还是袋鼠国的中学生都可以学(只要愿意并且申请)?

中国 (或中国裔) 学生学生更喜欢去那些非常卷的学校,那里大部分学生都是华人和印度人。

俺家娃这个学校是个白人学生为主的学校,学习成绩一般,体育成绩很突出,大家戏称为体校。

这个学校除了数学分为快慢班、体育自己选项目之外,其它课程都是统一设置的。

这边的学校教什么外语是学校自己定的,之前娃上的幼儿园和小学都是法语,现在变成了汉语和西班牙语。

如果想学自己感兴趣但学校恰好不教的外语,那就只能去校外辅导班学了。

scoopydoo 发表于 2025-2-1 11:53:56

zhengrob 发表于 2025-2-1 11:47
这中文课竟然占到并列第3的位置

应该是并列第四,前面有英语、数学、科学三门课呢。

这边的学校净整些杂七杂八的东西,如果把戏剧和音乐加起来,比其它任何一门“主课”的课时都更长,除非把“汉语”“西班牙语”两门加起来算作一门“外语” ;P

zhengrob 发表于 2025-2-1 12:00:04

跟课程表主题无关。matplotlib是否支持动态波显示?比如从串口读到的数据,在图表上动态画出波形的这种

scoopydoo 发表于 2025-2-1 12:07:30

zhengrob 发表于 2025-2-1 12:00
跟课程表主题无关。matplotlib是否支持动态波显示?比如从串口读到的数据,在图表上动态画出波形的这种

这个没试过,但是应该是可以的,只是不知道刷新速度如何。

girlexplorer 发表于 2025-2-1 13:17:05

楼主能将excel文件共享一下吗?(文件里如果有个人私有数据,请删除)
老衲顺手借此程序体验一下python。

suvsu 发表于 2025-2-1 13:35:50

厉害真羡慕会python,我现在准备学习做网页难吗!
页: [1] 2 3
查看完整版本: [折腾] [Python] 给儿子打印课程表,顺便统计课时