[折腾] [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()
这怕是交不了差
和美观八竿子打不着 本帖最后由 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个课时周期内的总上课时间,并生成一个饼图来展示这些时间分配。
JuncoJet 发表于 2025-1-31 23:41
这怕是交不了差
和美观八竿子打不着
不在乎美观,只要清楚就行,原来网站的配色不容易看清。 :lol girlexplorer 发表于 2025-1-31 23:42
老衲不懂python,看不懂楼上的代码,请AI帮忙:
请问以下这段代码的功能
AI 干这个简直是易如反掌啊! :lol 不是国内上学?全都是英文呢 澳洲居然有“满大人”课。是针对天朝移民的设置的课,还是袋鼠国的中学生都可以学(只要愿意并且申请)? hgb 发表于 2025-2-1 09:37
不是国内上学?全都是英文呢
人在澳洲呢 :lol 这中文课竟然占到并列第3的位置 量子隧道 发表于 2025-2-1 09:41
澳洲居然有“满大人”课。是针对天朝移民的设置的课,还是袋鼠国的中学生都可以学(只要愿意并且申请)?
中国 (或中国裔) 学生学生更喜欢去那些非常卷的学校,那里大部分学生都是华人和印度人。
俺家娃这个学校是个白人学生为主的学校,学习成绩一般,体育成绩很突出,大家戏称为体校。
这个学校除了数学分为快慢班、体育自己选项目之外,其它课程都是统一设置的。
这边的学校教什么外语是学校自己定的,之前娃上的幼儿园和小学都是法语,现在变成了汉语和西班牙语。
如果想学自己感兴趣但学校恰好不教的外语,那就只能去校外辅导班学了。
zhengrob 发表于 2025-2-1 11:47
这中文课竟然占到并列第3的位置
应该是并列第四,前面有英语、数学、科学三门课呢。
这边的学校净整些杂七杂八的东西,如果把戏剧和音乐加起来,比其它任何一门“主课”的课时都更长,除非把“汉语”“西班牙语”两门加起来算作一门“外语” ;P
跟课程表主题无关。matplotlib是否支持动态波显示?比如从串口读到的数据,在图表上动态画出波形的这种 zhengrob 发表于 2025-2-1 12:00
跟课程表主题无关。matplotlib是否支持动态波显示?比如从串口读到的数据,在图表上动态画出波形的这种
这个没试过,但是应该是可以的,只是不知道刷新速度如何。 楼主能将excel文件共享一下吗?(文件里如果有个人私有数据,请删除)
老衲顺手借此程序体验一下python。
厉害真羡慕会python,我现在准备学习做网页难吗!