python类中 cali_python中的.nc文件处理 | 05 NetCDF数据的进一步分析

NetCDF数据的进一步分析

比较不同数据集、不同季节的气候数据

import os

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import cartopy.crs as ccrs

import cartopy.feature as cfeature

import seaborn as sns

import geopandas as gpd

import earthpy as et

import xarray as xr

import regionmask

# 绘制设置

sns.set(font_scale=1.3) # 字号

sns.set_style("white",{'font.family': 'Times New Roman'}) # 主题

读取数据集

2006-2099年月最高气温

data_path_monthly = 'http://thredds.northwestknowledge.net:8080/thredds/dodsC/agg_macav2metdata_tasmax_BNU-ESM_r1i1p1_rcp45_2006_2099_CONUS_monthly.nc'

with xr.open_dataset(data_path_monthly) as file_nc:

monthly_forecast_temp_xr=file_nc

monthly_forecast_temp_xr

## 读取矢量数据

states_path = "ne_50m_admin_1_states_provinces_lakes"

states_path = os.path.join(

states_path, "ne_50m_admin_1_states_provinces_lakes.shp")

states_gdf=gpd.read_file(states_path)

cali_aoi=states_gdf[states_gdf.name=="California"]

# 获取aoi的左下-右上经纬度坐标

def get_aoi(shp, world=True):

"""Takes a geopandas object and converts it to a lat/ lon

extent """

lon_lat = {}

# Get lat min, max

aoi_lat = [float(shp.total_bounds[1]), float(shp.total_bounds[3])]

aoi_lon = [float(shp.total_bounds[0]), float(shp.total_bounds[2])]

# Handle the 0-360 lon values

if world:

aoi_lon[0] = aoi_lon[0] + 360

aoi_lon[1] = aoi_lon[1] + 360

lon_lat["lon"] = aoi_lon

lon_lat["lat"] = aoi_lat

return lon_lat

cali_bounds=get_aoi(cali_aoi)

# 数据切片

start_date="2059-12-15"

end_date="2099-12-15"

cali_temp=monthly_forecast_temp_xr["air_temperature"].sel(

time=slice(start_date,end_date),

lon=slice(cali_bounds["lon"][0],cali_bounds["lon"][1]),

lat=slice(cali_bounds["lat"][0],cali_bounds["lat"][1]))

cali_temp

print("Time Period start: ", cali_temp.time.min().values)

print("Time Period end: ", cali_temp.time.max().values)

Time Period start: 2059-12-15 00:00:00

Time Period end: 2099-12-15 00:00:00

# 掩膜

cali_mask=regionmask.mask_3D_geopandas(cali_aoi,

monthly_forecast_temp_xr.lon,

monthly_forecast_temp_xr.lat)

cali_temp_masked=cali_temp.where(cali_mask)

cali_temp_masked.dims

('time', 'lat', 'lon', 'region')

cali_temp_masked.shape

(481, 227, 246, 1)

计算每个季节的平均最高温

# groupby()参数:time.season time.month time.year

cali_season_summary=cali_temp_masked.groupby(

"time.season").mean("time",skipna=True)

cali_season_summary.shape # 汇总成四个季节

(4, 227, 246, 1)

# (DJF=Dec-Feb, MAM=Mar-May,. JJA=Jun-Aug, SON=Sep-Nov)

cali_season_summary.plot(col="season",col_wrap=2,figsize=(10,10))

plt.suptitle("Mean Temperature Across All Selected Years By Season \n California, USA",

y=1.05)

plt.show()

1b75c72fa2475f49d567295ad7a2014e.png

计算每年的每个季节的均值变化

String in the ‘#offset’ to specify the step-size along the resampled dimension

‘AS’: year start

‘QS-DEC’: quarterly, starting on December 1

‘MS’: month start

‘D’: day

‘H’: hour

‘Min’: minute

# Resample the data by season across all years

cali_season_mean_all_years = cali_temp_masked.resample(

time='QS-DEC', keep_attrs=True).mean()

cali_season_mean_all_years.shape

(161, 227, 246, 1)

# Summarize each array into one single (mean) value

cali_seasonal_mean = cali_season_mean_all_years.groupby('time').mean([

"lat", "lon"])

cali_seasonal_mean.shape

(161, 1)

f, ax = plt.subplots(figsize=(10, 4))

cali_seasonal_mean.plot(marker="o",

color="grey",

markerfacecolor="purple",

markeredgecolor="purple")

ax.set(title="Seasonal Mean Temperature")

plt.show()

9979b24cdbf3d5c205273cb06e51b2ad.png

# 转换成pd格式

cali_seasonal_mean_df = cali_seasonal_mean.to_dataframe()

cali_seasonal_mean_df.head()

# 导出为csv

cali_seasonal_mean_df.to_csv("cali-seasonal-temp.csv")

分季节绘制均值变化

colors={3:"grey",6:"lightgreen",9:"green",12:"purple"}

seasons={3:"spring",6:"summer",9:"fall",12:"winter"}

f,ax=plt.subplots(figsize=(10,7))

for month,arr in cali_seasonal_mean.groupby("time.month"):

arr.plot(ax=ax,

color="grey",

marker="o",

markerfacecolor=colors[month],

markeredgecolor=colors[month],

label=seasons[month])

ax.legend(bbox_to_anchor=(1.05,1),loc="upper left")

ax.set(title="Seasonal Change in Mean Temperature Over Time")

plt.show()

83a797f9b92f0bb1406ce51d886d4b30.png

参考链接:

https://www.earthdatascience.org/courses/use-data-open-source-python/hierarchical-data-formats-hdf/summarize-climate-data-by-season/

https://xarray.pydata.org/en/v0.8.2/generated/xarray.Dataset.resample.html

https://gitee.com/jiangroubao/learning/tree/master/NetCDF4

up-b472dbfd72a22c15207ce40aaf275d6787d.bmp

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值