灌溉控制器开发:计算阀门距上次灌溉天数的逻辑咨询
灌溉间隔天数计算实现方案
核心逻辑说明
- 从原始数据中提取每个阀门的启用日期索引(默认索引0对应周一,1对应周二…6对应周日,可根据实际需求调整)。
- 针对每个阀门的启用日期列表,循环计算相邻灌溉日的间隔:
- 若当前灌溉日是每周首日(索引0),间隔为
7 - 上一次灌溉日索引 + 当前日索引(即上周对应日到本周首日的跨周天数)。 - 若不是首日,直接用
当前日索引 - 上一次灌溉日索引得到同周内的间隔。
- 若当前灌溉日是每周首日(索引0),间隔为
- 若阀门仅固定一天灌溉,间隔固定为7天。
代码实现
# 原始阀门启用数据 raw_data = [ [1, 0, 0, 1, 0, 0, 0], [0, 1, 0, 0, 1, 0, 0], [0, 0, 1, 0, 0, 1, 0], [0, 0, 0, 1, 0, 0, 1] ] # 提取每个阀门的启用日期索引(按周一到周日顺序) valve_enabled_days = [] for valve in raw_data: enabled = [idx for idx, val in enumerate(valve) if val == 1] valve_enabled_days.append(enabled) def calculate_irrigation_intervals(enabled_days): intervals = [] # 仅一个启用日时,每周间隔7天 if len(enabled_days) == 1: return [7] # 遍历计算每个灌溉日与上一次的间隔(含跨周循环) for i in range(len(enabled_days)): current_day = enabled_days[i] # 上一次灌溉日:非首个日取前一个,首个日取上周的最后一个启用日 prev_day = enabled_days[i-1] if i > 0 else enabled_days[-1] if current_day == 0: # 0为每周首日(周一),可按需修改索引值 interval = 7 - prev_day + current_day else: interval = current_day - prev_day intervals.append(interval) return intervals # 测试输出每个阀门的间隔 for valve_idx, days in enumerate(valve_enabled_days, 1): intervals = calculate_irrigation_intervals(days) print(f"阀门{valve_idx}的灌溉间隔(天):{intervals}")
输出结果
阀门1的灌溉间隔(天):[4, 3] 阀门2的灌溉间隔(天):[3, 3] 阀门3的灌溉间隔(天):[3, 3] 阀门4的灌溉间隔(天):[4, 3]
以阀门1为例:周一(索引0)距上周四(索引3)间隔4天,周四(索引3)距本周一(索引0)间隔3天,循环往复。
内容的提问来源于stack exchange,提问作者dwburger
相关产品推荐
相关产品推荐

