Python中想要利用一个方程计算1-12月各个月份的热扩散值,但是现只会分别计算2月份和其他除2月外月份的值,这是我分别计算的代码,是可以正常运行的,先放上数据格式
下面是我计算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")
倒是可以运行出来 但运行结果显示如下
结合的代码,在计算2月时,没有根据年份判断是否是有闰月的年份,少加了条件. 应该是少了 两个if判断
if i in years1:
for k in range(1,29):
pass
if i in years2:
for k in range(1,30):
pass
直接分组计算呀
看看这个,是否有帮助
https://b23.tv/EV4Fdw7
个人建议啊,为什么不直接用python自带模块根据某年某月来确定是多少天 然后遍历天数呢?
如下我直接输入 2011 2 确定是多少天 然后循环去处理每天的数据
from calendar import monthrange
print(monthrange(2011, 2)[1])
你这个写法呢,是把问题弄复杂了。
其实不管哪年哪个月你的计算方式是相同的,就是天数不同而已,所以你只需写一个计算函数,天数作为参数就行了。代码精简了,可读性也更强了。
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]