根据《环境空气质量指数(AQI)技术规定(试行)》标准号:HJ 633—2012的标准,获取6参后计算小时AQI,PM2.5等无小时浓度限值按照24小时限值计算。
#2024/10/24 代码修正,部分参数取整时会让AQI出现小于平台系统计算值1,已更正取整逻辑。
class AirHourValue_AQICompute:#根据大气六参判断aqi
IAQI_list = [0, 50, 100, 150, 200, 300, 400, 500]
SO2_LimitList = [0, 150, 500, 650, 800]
NO2_LimitList = [0, 100, 200, 700, 1200, 2340, 3090, 3840]
CO_LimitList = [0, 5, 10, 35, 60, 90, 120, 150]
O3_LimitList = [0, 160, 200, 300, 400, 800, 1000, 1200]
PM25_LimitList = [0, 35, 75, 115, 150, 250, 350, 500]
PM10_LimitList = [0, 50, 150, 250, 350, 420, 500, 600]
KeyPollutant_list=["NO2","SO2","CO","O3","PM10","PM2.5"]
AirQualityGrade_list=["优","良","轻度污染","中度污染","重度污染","严重污染"]
def __init__(self,NO2_HourValue,SO2_HourValue,CO_HourValue,O3_HourValue,PM10_HourValue,PM25_HourValue):
self.NO2_HourValue=NO2_HourValue
self.SO2_HourValue=SO2_HourValue
self.CO_HourValue=CO_HourValue
self.O3_HourValue=O3_HourValue
self.pm10_HourValue=PM10_HourValue
self.pm25_HourValue=PM25_HourValue
def AirHourValue_IAQI(self,iaqi_h, iaqi_l, bp_h, bp_l, c_p):
iaqi_p = (iaqi_h - iaqi_l) / (bp_h - bp_l) * (c_p - bp_l) + iaqi_l
return iaqi_p
def NO2_IAQI(self,NO2_HourValue, NO2_LimitList,IAQI_list):
try:
for i in range(len(NO2_LimitList)):
if NO2_HourValue >= NO2_LimitList[i]:
iaqi_h = IAQI_list[i + 1]
iaqi_l = IAQI_list[i]
bp_h = NO2_LimitList[i + 1]
bp_l = NO2_LimitList[i]
NO2IAQI_Value=round(self.AirHourValue_IAQI(iaqi_h, iaqi_l, bp_h, bp_l, NO2_HourValue))
except:
NO2IAQI_Value= 'NaN'
return NO2IAQI_Value
def SO2_IAQI(self,SO2_HourValue,SO2_LimitList,IAQI_list):
try:
for i in range(len(SO2_LimitList)):
if SO2_HourValue >= SO2_LimitList[i]:
iaqi_h = IAQI_list[i + 1]
iaqi_l = IAQI_list[i]
bp_h = SO2_LimitList[i + 1]
bp_l = SO2_LimitList[i]
SO2IAQI_Value = round(self.AirHourValue_IAQI(iaqi_h, iaqi_l, bp_h, bp_l, SO2_HourValue))
except:
SO2IAQI_Value = 'NaN'
return SO2IAQI_Value
def CO_IAQI(self, CO_HourValue, CO_LimitList, IAQI_list):
try:
for i in range(len(CO_LimitList)):
if CO_HourValue >= CO_LimitList[i]:
iaqi_h = IAQI_list[i + 1]
iaqi_l = IAQI_list[i]
bp_h = CO_LimitList[i + 1]
bp_l = CO_LimitList[i]
COIAQI_Value = round(self.AirHourValue_IAQI(iaqi_h, iaqi_l, bp_h, bp_l, CO_HourValue))
except:
COIAQI_Value = 'NaN'
return COIAQI_Value
def O3_IAQI(self, O3_HourValue, O3_LimitList, IAQI_list):
try:
for i in range(len(O3_LimitList)):
if O3_HourValue >= O3_LimitList[i]:
iaqi_h = IAQI_list[i + 1]
iaqi_l = IAQI_list[i]
bp_h = O3_LimitList[i+1]
bp_l = O3_LimitList[i]
O3IAQI_Value = round(self.AirHourValue_IAQI(iaqi_h, iaqi_l, bp_h, bp_l, O3_HourValue))
except:
O3IAQI_Value = 'NaN'
return O3IAQI_Value
def PM10_IAQI(self, PM10_HourValue, PM10_LimitList, IAQI_list):
try:
for i in range(len(PM10_LimitList)):
if PM10_HourValue >= PM10_LimitList[i]:
iaqi_h = IAQI_list[i + 1]
iaqi_l = IAQI_list[i]
bp_h = PM10_LimitList[i + 1]
bp_l = PM10_LimitList[i]
PM10IAQI_Value = round(self.AirHourValue_IAQI(iaqi_h, iaqi_l, bp_h, bp_l, PM10_HourValue))
except:
PM10IAQI_Value = 'NaN'
return PM10IAQI_Value
def PM25_IAQI(self, PM25_HourValue, PM25_LimitList, IAQI_list):
try:
for i in range(len(PM25_LimitList)):
if PM25_HourValue >= PM25_LimitList[i]:
iaqi_h = IAQI_list[i + 1]
iaqi_l = IAQI_list[i]
bp_h = PM25_LimitList[i + 1]
bp_l = PM25_LimitList[i]
PM25IAQI_Value = round(self.AirHourValue_IAQI(iaqi_h, iaqi_l, bp_h, bp_l, PM25_HourValue))
except:
PM25IAQI_Value = 'NaN'
return PM25IAQI_Value
def AQI_Compute(self):
NO2IAQI=self.NO2_IAQI(self.NO2_HourValue,self.NO2_LimitList,self.IAQI_list)
SO2IAQI=self.SO2_IAQI(self.SO2_HourValue,self.SO2_LimitList,self.IAQI_list)
COIAQI=self.CO_IAQI(self.CO_HourValue,self.CO_LimitList,self.IAQI_list)
O3IAQI=self.O3_IAQI(self.O3_HourValue,self.O3_LimitList,self.IAQI_list)
PM10IAQI=self.PM10_IAQI(self.pm10_HourValue,self.PM10_LimitList,self.IAQI_list)
PM25IAQI=self.PM25_IAQI(self.pm25_HourValue,self.PM25_LimitList,self.IAQI_list)
AQI_Value_list=[NO2IAQI,SO2IAQI,COIAQI,O3IAQI,PM10IAQI,PM25IAQI]
AQI_EffectiveValue_list=[i for i in AQI_Value_list if i != 'NaN']
try:
AQI_Value=max(AQI_EffectiveValue_list)
except:
AQI_Value='(H)'
if AQI_Value=='(H)':
AQI_Grade = '(H)'
elif AQI_Value > 300:
AQI_Grade = '严重污染'
else:
for i in range(6):
if AQI_Value<=self.IAQI_list[i+1]:
AQI_Grade=self.AirQualityGrade_list[i]
break
Keypollutant=[]#主要污染物,以列表形式存储
key_number=0 #用于记录AQI_Value_list中与AQI_Value相同的污染物序号
for i in AQI_Value_list:
try:
if 0 <= AQI_Value <= 50:
Keypollutant.append('-')
break
elif i == AQI_Value:
Keypollutant.append(self.KeyPollutant_list[key_number])
key_number=key_number+1
except:
Keypollutant.append('H')
break
return AQI_Value,AQI_Grade,Keypollutant
if __name__ == '__main__':
test_aqi=AirHourValue_AQICompute(5,10,0.614,101,24,13).AQI_Compute()
print(test_aqi)