1.区域提取
(1)ERA5数据的区域提取其实在下载页面就可以直接选择需要的区域,选择一个城市大小的区域文件只要25KB左右
在这个页面中,东经西经、南纬北纬的选择是以正负号来确定的,当选择的区域是西经、南纬时,需要加负号
(2)如果忘记了选择具体的区域,下载了整个文件,那么最推荐的是重新选择区域下载,其次可以用以下代码选择(参考了知乎回答:https://www.zhihu.com/question/585273125/answer/2903435770)
import netCDF4 as nc import pandas as pd #打开nc文件 with nc.Dataset('xxx.nc', 'r') as ds: var = ds.variables['xxx'][:]#此处把xxx换位要提取的要素标签 # 定义经纬度范围 lon_min, lon_max = 118.68, 118.93 lat_min, lat_max = 31.95, 32.15 #制作范围 lon_range = (ds.variables['longitude'][:] >= lon_min) & (ds.variables['longitude'][:] <= lon_max) lat_range = (ds.variables['latitude'][:] >= lat_min) & (ds.variables['latitude'][:] <= lat_max) # 提取区域数据 var_region = var[:, lat_range, lon_range] var_region_2d = var_region.reshape(var_region.shape[0], -1) # 将数据转换为DataFrame df = pd.DataFrame(var_region_2d) # 添加转换后的时间列 df['time'] = nc.num2date(ds.variables['time'][:],'hours since 1900-1-1 00:00:00').data # 导出数据 df.to_csv('output.csv', index=False)
其输出的csv是这样的
2.做完上述操作得到了看起来已经可以使用的数据,但是我们还有一件非常重要事情要做
ERA5的数据使用的时间是UTC世界时,与我国的北京时间相差8小时,如果将上面csv中的开尔文转为温度就会发现早上9点是一天中最热的时候,而中午一点却是最冷的时候,需要对时间列进行世界转换
(1)将时间列修改一下单元格格式方便读取,修改为“自定义-yyyy/mm/dd/hh”格式
(2)时间转换代码如下
import csv import datetime from datetime import timedelta import pandas as pd #准备储存北京时的列表 time_bj_list=[] with open('output.csv', 'r') as f: reader = csv.reader(f) #跳过表头 next(reader) for row in reader: origin_time=row[2] print(origin_time) #将字符串转为时间戳 time_utc = datetime.datetime.strptime(origin_time,"%Y/%m/%d/%H") #查看转换好的时间戳 print(time_utc) #对时间戳进行世界时转北京时 time_bj = time_utc+timedelta(hours=8) #将北京时存入列表中 time_bj_list.append(time_bj) #pd读取csv,准备在原有列旁新增一列 Data=pd.read_csv('output.csv') #新增'bj_time'列,将储存着北京时的列表输入此列 Data['bj_time']=time_bj_list #将新增了bj_time列的Data覆盖原有文件 Data.to_csv('output.csv',index=False)
转换后在原有的时间旁边新增了北京时间列
(3)附:温度转换
ERA5的温度单位是K,需要-273.15转换为摄氏度