Python(Tkinter)灌溉定时器:求阀门工作日间隔天数的实现方法
实现思路与代码示例
核心步骤
- 建立星期与数字的映射
把星期字符串转换成0-6的数字(比如周日=0,周一=1…周六=6),方便计算天数差:
day_map = { 'Sunday': 0, 'Monday': 1, 'Tuesday': 2, 'Wednesday': 3, 'Thursday': 4, 'Friday': 5, 'Saturday': 6 }
- 拆分并清洗单阀门的日期列表
先把总日期列表按阀门拆分(建议从复选框提取时就按阀门分组存储,避免多阀门数据混合),然后对单个阀门的日期做去重、排序:
# 假设阀门1的工作日期列表是 valve1_days = ['Sunday', 'Tuesday', 'Friday'] # 去重并转换为数字格式 valve_days_num = [day_map[day] for day in set(valve1_days)] # 按星期顺序排序 sorted_days = sorted(valve_days_num)
- 计算相邻日期间隔(含跨周)
遍历排序后的日期列表,计算常规相邻间隔;最后一个日期到下一周第一个日期的间隔,用「下一周首个日期的数字+7」减去最后一个日期的数字:
intervals = [] n = len(sorted_days) if n == 1: # 仅设置一个工作日期时,间隔固定为7天(每周循环) intervals.append(7) else: # 计算非跨周的相邻间隔 for i in range(n - 1): intervals.append(sorted_days[i+1] - sorted_days[i]) # 计算跨周的最后一个到第一个的间隔 cross_interval = (sorted_days[0] + 7) - sorted_days[-1] intervals.append(cross_interval)
示例验证
以阀门1的sorted_days = [0,2,5]为例,计算得到的intervals = [2,3,2]:
- 周日(0)到周二(2):2天
- 周二(2)到周五(5):3天
- 周五(5)到下周日(0+7=7):7-5=2天,完全符合需求。
注意事项
- 拆分阀门日期时,必须保证每个阀门的日期列表独立,避免多阀门数据混淆;
- 去重操作是为了避免用户重复勾选同一天导致计算错误;
- 需处理边界情况:如果阀门仅设置一个工作日期,间隔固定为7天。
内容的提问来源于stack exchange,提问作者dwburger
相关产品推荐
相关产品推荐

