如何跳过指定时间步并让后续时间步引用更早的历史数据
如何跳过指定时间步并让后续时间步引用更早的历史数据
我明白你的问题了——你想跳过t=1861这个时间步,同时让t=1862计算时用t=1860的数据,而不是默认的t-1=1861。你之前直接给t-1赋值的思路确实行不通,因为t-1是一个临时表达式,不是可修改的变量。这里给你一个更合理的解决方案:
核心思路是用一个单独的变量跟踪上一个有效的时间步,而不是依赖t-1这个固定的偏移。这样就能灵活控制“上一步”到底是哪个时间点,哪怕中间跳过了某些步。
修改后的代码示例:
# 初始化上一个有效时间步:假设time的第一个元素是1,那么初始prev_t就是0(对应第一个t的t-1) prev_t = time[0] - 1 for t in time: # 跳过指定时间步,不更新prev_t if t == 1861: continue ELZfarm_m_h2_production=0 ELZfarm_m_O2_production=0 h2_net_to_change_from_storage=0 # 注意:这里全部用prev_t代替原来的t-1 # System consumption at prev_t (原t-1的逻辑) # Power consumed by the ELZs P_ELZ_inoperation_tbefore = sum(ELZmodule[key]['Power'][prev_t] for key in ELZmodule.keys() ) # MW # Power consumed by UTILITIES Power_consump_utilities_Mw= sum(Power_consumption_utilities[key][prev_t] for key in Power_consumption_utilities.keys() ) # MW # Total Power consumed by the system Power_consump_system_tot_Mw = P_ELZ_inoperation_tbefore + Power_consump_utilities_Mw # MW # Determing the total Delta Power variation from prev_t Delta_P_system = Psolar[t] - Power_consump_system_tot_Mw # MW # Positive Delta Power Variation if Delta_P_system >= 0: # 你的原有逻辑代码...... pass # 处理完当前t后,更新prev_t为当前t(跳过的t不会走到这一步,所以prev_t保持不变) prev_t = t
为什么这个方法有效?
- 当
t=1861时,我们直接continue跳过循环体,不会更新prev_t,所以prev_t仍然是1860。 - 当
t=1862进入循环时,所有需要“上一步数据”的地方都会用prev_t=1860,正好符合你的需求。 - 对于其他正常时间步,
prev_t会在每次循环结束后更新为当前t,保持原来t-1的逻辑不变。
额外注意点
- 确保
prev_t的初始值是合理的:比如如果time的第一个元素是0,那初始prev_t可能需要设为-1?不过看你的代码里用t-1作为索引,应该time是从1开始的连续序列,所以初始prev_t=0是安全的。 - 要确认
prev_t对应的索引在ELZmodule、Power_consumption_utilities和Psolar中都是存在的,避免出现KeyError或IndexError。
备注:内容来源于stack exchange,提问作者user28666259
相关产品推荐
相关产品推荐

