• Анализ NO2 c помощью Python. Часть 2.

    Продолжение статьи по анализу данных NetCDF на Python, первая часть которой была опубликована ранее. Завершающая часть полного чтения и визуализации данных по анализу NO2. Доступны для скачивания все лист-коды, необходимые в работе.

    Первоначально считаю необходимым отметить, что, возможно, не стоило комментарии и подписи в коде делать на русском языке, так как из-за кодировки могут возникнуть непонятные символы, в которых трудно будет разобраться. Возможно, моя ошибка по незнанию, но в первой и в этой части я продолжу использовать кириллицу, а в последующих буду писать либо на латинице русские слова, либо сразу делать комментарии на английском (что более перспективнее).

    Так или иначе, продолжаем проводить анализ NO2 c помощью Python.

    1. После завершения первой части, в среде Spyder необходимо закрыть все предыдущие файлы, перезапустить ядро, но остаться в нашей подготовленной директории.

    Далее мы должны ввести следующее:

     
    import numpy as np
    from mpl_toolkits.basemap import Basemap
    import matplotlib.pyplot as plt
    import sys
    from netCDF4 import Dataset
    
    

    try: fileList=open(„fileList.txt“,„r“)
    except: print(„Файл не найден. Проверте, возможно, есть несовпадения“) sys.exit()

    for FILE_NAME in fileList: FILE_NAME=FILE_NAME.strip() user_input=input(„\nВы хотите начать обработку данных\n“ + FILE_NAME + „\n\n(Д/Н)“) if(user_input 'Н' or user_input „н“): print(„Skipping…“) continue else: file = Dataset(FILE_NAME, „r“)

    ds=file grp=„PRODUCT“ lat= ds.groups[grp].variables[„latitude“]0[:][:] lon= ds.groups[grp].variables[„longitude“]0[:][:] if „NO2“ in FILE_NAME: sds_name=„nitrogendioxide_tropospheric_column“ map_label=„mol/m2“ if „AER_AI“ in FILE_NAME: sds_name=„aerosol_index_354_388“ map_label=„Aerosol Index“ data= ds.groups[grp].variables[sds_name] fv=data._FillValue min_lat=np.min(lat) max_lat=np.max(lat) min_lon=np.min(lon) max_lon=np.max(lon) map_title = data.long_name print(data.units) dataArray=np.array(data0[:][:]) dataArray[dataArray==fv]=np.nan data=dataArray average=np.nanmean(dataArray) stdev=np.nanstd(dataArray) median=np.nanmedian(dataArray) # подписать как „mol/cm2“ print(„The average of this data is: „,“{:.2e}“.format(average),“\nThe standard deviation is: „,“{:.2e}“.format(stdev),“\nThe median is: „,“{:.2e}“.format(median)) print(„The range of latitude in this file is: „,min_lat,“ to „,max_lat, „degrees \nThe range of longitude in this file is: „,min_lon, „ to „,max_lon,“ degrees“) is_map=input(„\nПостроить картографический материал? Нажмите Д или Н \n“) if is_map 'Д' or is_map „д“: data = np.ma.masked_array(data, np.isnan(data)) m = Basemap(projection=„cyl“, resolution=„l“, llcrnrlat=-90, urcrnrlat = 90, llcrnrlon=-180, urcrnrlon = 180) m.drawcoastlines(linewidth=0.5) m.drawparallels(np.arange(-90., 120., 30.), labels=[1, 0, 0, 0]) m.drawmeridians(np.arange(-180, 180., 45.), labels=[0, 0, 0, 1]) my_cmap = plt.cm.get_cmap(„jet“) my_cmap.set_under(„w“) vmin1=0.0 vmax1=0.05 if „AER_AI“ in FILE_NAME: vmin1=-2.0 vmax1=0.4 m.pcolormesh(lon, lat, data, latlon=True, vmin=vmin1, vmax=np.nanmax(data)*vmax1,cmap=my_cmap) cb = m.colorbar() cb.set_label(map_label) plt.autoscale() #присаваиваем название схемы plt.title(„{0}\n {1}“.format(FILE_NAME, map_title)) fig = plt.gcf() plt.show() is_save=str(input(„\nСохранить созданный файл? Нажмите Д или Н \n“)) if is_save 'Д' or is_save „д“: pngfile = „{0}.png“.format(FILE_NAME[:-3]) fig.savefig(pngfile, dpi = 300) file.close()

    2. После того, как ввели необходимый код (в самом файле .py будут комментарии по поводу всех выполняемых там действий), нажимаем Run и смотрим, то происходит в Консоли.

    NO2_mapping

    В начале будет предложено начать обработку данных. Мы работаем исключительно с NO2, однако если бы в нашем fileList были и данные по аэрозолям AER_AI, код работал бы и с ними, о чем свидетельствует фрагмент кода:

     
    ...
    if 'NO2' in FILE_NAME:
                sds_name='nitrogendioxide_tropospheric_column'
                map_label='mol/m2'
            if 'AER_AI' in FILE_NAME:
                sds_name='aerosol_index_354_388'
                map_label='Aerosol Index'
    ...
     
    

    Помним, что данная программа работает с русскими буквами, так что нажимаем «д» и жмем Enter.
    На финальных стадиях в Консоли будет выведено изображение, а после предложение о сохранении нашей картосхемы.
    В принципе, на этом можно заканчивать. Основная часть сделана. Таким способом можно быстро получить необходимую информацию из NetCDF и визуализировать ее.

    3.



    В процессе работы обнаружил следующее. Почему-то при процессе визуализации данные отображаются не полностью.

    error_maybe

    Сам код работает корректно с другими данными NetCDF, например с аэрозолями и т.п. Сам же исходный S5P_OFFL_L2__NO2____20190330T092200_20190330T110331_07562_01_010300_20190405T105720.nc корректно отображается и в другим программах по обработке данных.
    На момент написания причины найти не смог. Возможно, найду позже.

    Опубликовано · Автор