空气质量指数(AQI)计算

 根据《环境空气质量指数(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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值