python 如何从包含全球数据的netCDF 4文件中获取特定国家/地区的数据

yiytaume  于 2023-05-21  发布在  Python
关注(0)|答案(1)|浏览(151)

我从ESGF网站下载了tasmax数据集。数据集中的.nc文件包含从1850年到2014年的全球数据。但是,我需要孟加拉国、斯里兰卡、巴基斯坦、马尔代夫等特定国家的数据。然后在这些特定的国家进行研究。
包含1850年至1899年数据的.nc文件的详细信息:

table_id: day
table_info: Creation Date:(20 February 2019) MD5:951084b632bd52c3f6224e495b1cb65e
title: INM-CM4-8 output prepared for CMIP6
tracking_id: hdl:21.14100/819efd11-8094-46b4-86a9-1296bfe83b55
variable_id: tasmax

dict_keys(['time', 'time_bnds', 'lat', 'lat_bnds', 'lon', 'lon_bnds', 'height', 'tasmax']) 

dimensions(sizes): time(5475), lat(120), lon(180), bnds(2)

tasmax变量的详细信息:

tasmax=ds.variables['tasmax']
    print(tasmax)

这给出输出:

<class 'netCDF4._netCDF4.Variable'>
   float32 tasmax(time, lat, lon)
        standard_name: air_temperature
        long_name: Daily Maximum Near-Surface Air Temperature
        comment: maximum near-surface (usually, 2 meter) air 
    temperature (add cell_method attribute 'time: max')
        units: K
        original_name: tasmax
        cell_methods: area: mean time: maximum (interval: 1 day)
        cell_measures: area: areacella
        history: 2019-05-28T11:29:24Z altered by CMOR: Treated 
    scalar dimension: 'height'.
        coordinates: height
        missing_value: 1e+20
        _FillValue: 1e+20
    unlimited dimensions: time
    current shape = (5475, 120, 180)
    filling on, default _FillValue of 9.969209968386869e+36 used

    tasmax.dimentions
    ('time', 'lat', 'lon')

该文件在绘制时显示整个地球仪每天的tasmax数据。我只需要一个特定国家的数据,而不是地球仪。我使用Python,但我也可以使用QGIS和ArcGIS,如果这是一个更好的方法。
我试着在lat和lon空间中放置特定的坐标,如下所示:

print(temp[:,23.35,90])

其中23.35和90是孟加拉国某点的经度和纬度。
这给出输出:[282.4348 281.53607 283.49426 ... 280.90012 282.33377 282.48367]
通过这种方式,我可以提取特定点的数据。但是国家有很多纬度点,所以我不能对每个点都这样做,因为这样效率不高。
我还创建了一个numpy dataframe,并使用它将数据提取到csv文件中。
我想做趋势分析,看看孟加拉国的tasmax方差。为此,我需要孟加拉国的时间序列数据。我需要检测孟加拉国多年来的温度变化。
我想做1。Mann Kendall检验,2.斯皮尔曼秩相关检验,3。森氏斜率,4.方差相关分析与M-K检验
因此,我需要网格化的数据集是只有孟加拉国,而不是整个地球仪。
我试着用一个世界shapefile把数据导入qgis。netCDF 4数据不与shapefile重叠。事实上,它也被翻转了。

我不知道怎么把它翻到右边,怎么让它正确地重叠。
我也意识到我的netcdf 4数据的分辨率是100 kms,这是非常大的。如何将其减少到25公里?

xwbd5t1u

xwbd5t1u1#

您可以使用QGIS来获取所需的数据。您应该添加您的国家的矢量图层,并添加netcdf文件作为光栅层。对于您的国家shapefile,您可以轻松地在线查找全球国家shapefile,然后打开属性表,切换编辑模式并删除除您所在国家以外的所有国家。请注意,你应该为每个你想要的国家单独做。然后从菜单:
·光栅>提取>通过遮罩层裁剪光栅
clip raster by layer
选择你的栅格数据和你的国家shapefile为多边形,保存为netcdf文件。现在你有一个网格化的时间序列数据只有你的国家。同样通过qgis中的数据工具,你也可以取你国家边界内所有点的平均值。

相关问题