对ERA5数据进行区域提取及时间处理

发布时间 2023-09-13 10:41:19作者: Victooor_swd

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转换为摄氏度