python中if,elif,else循环遇到问题,不知如何解决

Python中想要利用一个方程计算1-12月各个月份的热扩散值,但是现只会分别计算2月份和其他除2月外月份的值,这是我分别计算的代码,是可以正常运行的,先放上数据格式

img

下面是我计算1、3-12月的代码

[]([](

import pandas as pd
import numpy as np

csv=pd.read_csv("C:\\Users\86139\Desktop/NADORS.csv",header=0,encoding="unicode_escape")
csv= csv.values
year=np.array(csv[:, 0])
month=np.array(csv[:, 1])
day=np.array(csv[:, 2])
tem20=np.array(csv[:, 3])
tem50=np.array(csv[:, 4])
tem100=np.array(csv[:, 5])
tem200=np.array(csv[:, 6])

dep=[0.2,0.5,1.0,2.0] 
d2050=[] 
d50100=[] 
d100200=[] 
years=np.arange(2010,2017)
years1=[2010,2011,2013,2014,2015]
years2=[2012,2016]
months=np.arange(1,13)
days=np.arange(1,32)
a=[1,3,5,7,8,10,12]
b=[4,6,9,11]
c=[2]

years

for i in years: 
    for j in range(1,13): 
        temm20=[]
        temm50=[] 
        temm100=[] 
        temm200=[]
        if j in a :
            for k in range(1,32):
                temm20.append(np.mean(tem20[np.where((year==i)&(month==j)&(day==k))])) 
                temm50.append(np.mean(tem50[np.where((year==i)&(month==j)&(day==k))])) 
                temm100.append(np.mean(tem100[np.where((year==i)&(month==j)&(day==k))])) 
                temm200.append(np.mean(tem200[np.where((year==i)&(month==j)&(day==k))]))
            d2050.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm50)-np.min(temm50))/(np.max(temm20)-np.min(temm20)))/(-1)/(dep[1]-dep[0]))**2)*(10**6)) 
            d50100.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm100)-np.min(temm100))/(np.max(temm50)-np.min(temm50)))/(-1)/(dep[2]-dep[1]))**2)*(10**6)) 
            d100200.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm200)-np.min(temm200))/(np.max(temm100)-np.min(temm100)))/(-1)/(dep[3]-dep[2]))**2)*(10**6))
        if j in b:
            for k in range(1,31):
                temm20.append(np.mean(tem20[np.where((year==i)&(month==j)&(day==k))])) 
                temm50.append(np.mean(tem50[np.where((year==i)&(month==j)&(day==k))])) 
                temm100.append(np.mean(tem100[np.where((year==i)&(month==j)&(day==k))])) 
                temm200.append(np.mean(tem200[np.where((year==i)&(month==j)&(day==k))]))
            d2050.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm50)-np.min(temm50))/(np.max(temm20)-np.min(temm20)))/(-1)/(dep[1]-dep[0]))**2)*(10**6)) 
            d50100.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm100)-np.min(temm100))/(np.max(temm50)-np.min(temm50)))/(-1)/(dep[2]-dep[1]))**2)*(10**6)) 
            d100200.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm200)-np.min(temm200))/(np.max(temm100)-np.min(temm100)))/(-1)/(dep[3]-dep[2]))**2)*(10**6))

frame2={'d20-50':d2050,'d50-100':d50100,'d100-200':d100200} 
dataframe2=pd.DataFrame(frame2)
dataframe2
dataframe2.to_csv("C:\\Users\\86139\\Desktop/NADORSdataframeWITHOUT2.csv")
```))

下面是我计算2月份的代码后边的计算部分
```python
for i in years: 
    for j in c: 
        temm20=[]
        temm50=[] 
        temm100=[] 
        temm200=[] 
        if i in years1 :
            for k in range(1,29):
                temm20.append(np.mean(tem20[np.where((year==i)&(month==j)&(day==k))])) 
                temm50.append(np.mean(tem50[np.where((year==i)&(month==j)&(day==k))])) 
                temm100.append(np.mean(tem100[np.where((year==i)&(month==j)&(day==k))])) 
                temm200.append(np.mean(tem200[np.where((year==i)&(month==j)&(day==k))]))
            d2050.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm50)-np.min(temm50))/(np.max(temm20)-np.min(temm20)))/(-1)/(dep[1]-dep[0]))**2)*(10**6)) 
            d50100.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm100)-np.min(temm100))/(np.max(temm50)-np.min(temm50)))/(-1)/(dep[2]-dep[1]))**2)*(10**6)) 
            d100200.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm200)-np.min(temm200))/(np.max(temm100)-np.min(temm100)))/(-1)/(dep[3]-dep[2]))**2)*(10**6))
        if i in years2:
            for k in range(1,30):
                temm20.append(np.mean(tem20[np.where((year==i)&(month==j)&(day==k))])) 
                temm50.append(np.mean(tem50[np.where((year==i)&(month==j)&(day==k))])) 
                temm100.append(np.mean(tem100[np.where((year==i)&(month==j)&(day==k))])) 
                temm200.append(np.mean(tem200[np.where((year==i)&(month==j)&(day==k))]))
            d2050.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm50)-np.min(temm50))/(np.max(temm20)-np.min(temm20)))/(-1)/(dep[1]-dep[0]))**2)*(10**6)) 
            d50100.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm100)-np.min(temm100))/(np.max(temm50)-np.min(temm50)))/(-1)/(dep[2]-dep[1]))**2)*(10**6)) 
            d100200.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm200)-np.min(temm200))/(np.max(temm100)-np.min(temm100)))/(-1)/(dep[3]-dep[2]))**2)*(10**6))

frame3={'d20-50':d2050,'d50-100':d50100,'d100-200':d100200} 
dataframe3=pd.DataFrame(frame3)
dataframe3
dataframe3.to_csv("C:\\Users\\86139\\Desktop/newNADORSdataframe2.csv")

下面是我想结合到一起写的代码,前面是一致的,后边计算的部分我改成了如下

for i in years: 
    for j in range(1,13): 
        temm20=[]
        temm50=[] 
        temm100=[] 
        temm200=[]
        if j in a :
            for k in range(1,32):
               temm20.append(np.mean(tem20[np.where((year==i)&(month==j)&(day==k))])) 
                temm50.append(np.mean(tem50[np.where((year==i)&(month==j)&(day==k))])) 
                temm100.append(np.mean(tem100[np.where((year==i)&(month==j)&(day==k))])) 
                temm200.append(np.mean(tem200[np.where((year==i)&(month==j)&(day==k))]))
            d2050.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm50)-np.min(temm50))/(np.max(temm20)-np.min(temm20)))/(-1)/(dep[1]-dep[0]))**2)*(10**6)) 
            d50100.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm100)-np.min(temm100))/(np.max(temm50)-np.min(temm50)))/(-1)/(dep[2]-dep[1]))**2)*(10**6)) 
            d100200.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm200)-np.min(temm200))/(np.max(temm100)-np.min(temm100)))/(-1)/(dep[3]-dep[2]))**2)*(10**6))
        elif j in b:
            for k in range(1,31):
               temm20.append(np.mean(tem20[np.where((year==i)&(month==j)&(day==k))])) 
                temm50.append(np.mean(tem50[np.where((year==i)&(month==j)&(day==k))])) 
                temm100.append(np.mean(tem100[np.where((year==i)&(month==j)&(day==k))])) 
                temm200.append(np.mean(tem200[np.where((year==i)&(month==j)&(day==k))]))
            d2050.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm50)-np.min(temm50))/(np.max(temm20)-np.min(temm20)))/(-1)/(dep[1]-dep[0]))**2)*(10**6)) 
            d50100.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm100)-np.min(temm100))/(np.max(temm50)-np.min(temm50)))/(-1)/(dep[2]-dep[1]))**2)*(10**6)) 
            d100200.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm200)-np.min(temm200))/(np.max(temm100)-np.min(temm100)))/(-1)/(dep[3]-dep[2]))**2)*(10**6))
        else:
            for k in range(1,29):
                temm20.append(np.mean(tem20[np.where((year==i)&(month==j)&(day==k))])) 
                temm50.append(np.mean(tem50[np.where((year==i)&(month==j)&(day==k))])) 
                temm100.append(np.mean(tem100[np.where((year==i)&(month==j)&(day==k))])) 
                temm200.append(np.mean(tem200[np.where((year==i)&(month==j)&(day==k))]))
            d2050.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm50)-np.min(temm50))/(np.max(temm20)-np.min(temm20)))/(-1)/(dep[1]-dep[0]))**2)*(10**6)) 
            d50100.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm100)-np.min(temm100))/(np.max(temm50)-np.min(temm50)))/(-1)/(dep[2]-dep[1]))**2)*(10**6)) 
            d100200.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm200)-np.min(temm200))/(np.max(temm100)-np.min(temm100)))/(-1)/(dep[3]-dep[2]))**2)*(10**6))
            for k in range(1,30):
                temm20.append(np.mean(tem20[np.where((year==i)&(month==j)&(day==k))])) 
                temm50.append(np.mean(tem50[np.where((year==i)&(month==j)&(day==k))])) 
                temm100.append(np.mean(tem100[np.where((year==i)&(month==j)&(day==k))])) 
                temm200.append(np.mean(tem200[np.where((year==i)&(month==j)&(day==k))]))
            d2050.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm50)-np.min(temm50))/(np.max(temm20)-np.min(temm20)))/(-1)/(dep[1]-dep[0]))**2)*(10**6)) 
            d50100.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm100)-np.min(temm100))/(np.max(temm50)-np.min(temm50)))/(-1)/(dep[2]-dep[1]))**2)*(10**6)) 
            d100200.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm200)-np.min(temm200))/(np.max(temm100)-np.min(temm100)))/(-1)/(dep[3]-dep[2]))**2)*(10**6))

frame2={'d20-50':d2050,'d50-100':d50100,'d100-200':d100200} 
dataframe2=pd.DataFrame(frame2)
dataframe2
dataframe2.to_csv("C:\\Users\\86139\\Desktop/123NADORSdataframe.csv")

倒是可以运行出来 但运行结果显示如下

img


正确结果应如

img


想请问问题究竟出在哪里呢?若能得到解答,感激不尽

结合的代码,在计算2月时,没有根据年份判断是否是有闰月的年份,少加了条件. 应该是少了 两个if判断

if i in years1:
  for k in range(1,29):
      pass
if i in years2:
  for k in range(1,30):
      pass

img


这里不是重复了吗?

直接分组计算呀

看看这个,是否有帮助
https://b23.tv/EV4Fdw7

个人建议啊,为什么不直接用python自带模块根据某年某月来确定是多少天 然后遍历天数呢?
如下我直接输入 2011 2 确定是多少天 然后循环去处理每天的数据

from calendar import monthrange
print(monthrange(2011, 2)[1])

img

你这个写法呢,是把问题弄复杂了。
其实不管哪年哪个月你的计算方式是相同的,就是天数不同而已,所以你只需写一个计算函数,天数作为参数就行了。代码精简了,可读性也更强了。
def calculate(days):
for k in range(1,days):
temm20.append(np.mean(tem20[np.where((year==i)&(month==j)&(day==k))]))
temm50.append(np.mean(tem50[np.where((year==i)&(month==j)&(day==k))]))
temm100.append(np.mean(tem100[np.where((year==i)&(month==j)&(day==k))]))
temm200.append(np.mean(tem200[np.where((year==i)&(month==j)&(day==k))]))
d2050.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm50)-np.min(temm50))/(np.max(temm20)-np.min(temm20)))/(-1)/(dep[1]-dep[0]))2)*(106))
d50100.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm100)-np.min(temm100))/(np.max(temm50)-np.min(temm50)))/(-1)/(dep[2]-dep[1]))2)*(106))
d100200.append((2*np.pi/86400./365.)/2./((np.log((np.max(temm200)-np.min(temm200))/(np.max(temm100)-np.min(temm100)))/(-1)/(dep[3]-dep[2]))2)*(106))

下面你只要调用函数之前判断某一年某一个月有多少天就行。而且这样也就不容易出错了。
import calendar
monthRange = calendar.monthrange(2016,2)
#输出的是一个元组,第一个元素是所查月份的第一天对应的是星期几(0-6),第二个元素是这个月的天数
days=monthRange[1]