Python 3.x 如何使用全年小时数据计算每天总降水量?

Python 3.x 如何使用全年小时数据计算每天总降水量?,python-3.x,dataset,analysis,cdo-climate,era5,Python 3.x,Dataset,Analysis,Cdo Climate,Era5,我有来自ERA5的特定年份每天的小时数据。我想把数据从每小时转换成每天。我知道这是一个漫长而艰难的过程,但我需要一些能轻松做到这一点的东西 哥白尼在这里有一个代码,如果数据集只转换一天,它就可以正常工作,但是当转换一整年时,我就遇到了问题 链接下载ERA5数据集,可从 按照以下步骤在此处使用哥白尼服务器 此脚本仅下载houly数据2天(2017年1月1日和2日): #/usr/bin/env python """ 另存为get-tp.py,然后运行“python get-tp.py”。 输入文

我有来自ERA5的特定年份每天的小时数据。我想把数据从每小时转换成每天。我知道这是一个漫长而艰难的过程,但我需要一些能轻松做到这一点的东西

哥白尼在这里有一个代码,如果数据集只转换一天,它就可以正常工作,但是当转换一整年时,我就遇到了问题

链接下载ERA5数据集,可从

按照以下步骤在此处使用哥白尼服务器

此脚本仅下载houly数据2天(2017年1月1日和2日):
#/usr/bin/env python
"""
另存为get-tp.py,然后运行“python get-tp.py”。
输入文件:无
输出文件:tp_20170101-20170102.nc
"""
导入cdsapi
c=cdsapi.Client()
r=c(
“再分析-era5-单级”{
“变量”:“总降水量”,
“产品类型”:“再分析”,
“年份”:“2017年”,
“月”:“01”,
“日”:['01','02'],
“时间”:[
'00:00','01:00','02:00',
'03:00','04:00','05:00',
'06:00','07:00','08:00',
'09:00','10:00','11:00',
'12:00','13:00','14:00',
'15:00','16:00','17:00',
'18:00','19:00','20:00',
'21:00','22:00','23:00'
],
“格式”:“netcdf”
})
r、 下载('tp_20170101-20170102.nc')
##添加多天和多个月以加载更多数据
下面的脚本将仅创建一天的netCDF文件
#/usr/bin/env python
"""
另存为文件calculate-daily-tp.py并运行“python计算每日tp.py”。
输入文件:tp_20170101-20170102.nc
输出文件:daily-tp_20170101.nc
"""
导入时间,sys
从datetime导入datetime,timedelta
从netCDF4导入数据集,date2num,num2date
将numpy作为np导入
日期=20170101
d=datetime.strtime(str(天),“%Y%m%d”)
f_in='tp_u%d-%s.nc'(天,(d+timedelta(天=1)).strftime('%Y%m%d'))
f_out='daily-tp_%d.nc'%day
所需时间=[]
对于范围(1,25)内的i:
所需时间。追加(d+timedelta(小时=i))
将数据集(f_in)作为ds_src:
var_time=ds_src.variables['time']
time_avail=num2date(var_time[:],var_time.units,
日历=var_time.calendar)
指数=[]
对于所需的tm时间:
a=np.where(time\u avail==tm)[0]
如果len(a)==0:
sys.stderr.write('错误:降水数据丢失/不完整-%s!\n'
%tm.strftime(“%Y%m%d%H:%m:%S”)
系统出口(200)
其他:
打印('找到%s'%tm.strftime('%Y%m%d%H:%m:%s'))
index.append(a[0])
var_tp=ds_src.variables['tp']
tp_值_集=假
对于索引中的idx:
如果未设置tp_值:
data=var_tp[idx,:,:]
tp_值_集=真
其他:
数据+=var_tp[idx,:,:]
数据集(f_out,mode='w',format='NETCDF3\u 64位\u OFFSET')作为ds_dest:
#尺寸
对于[‘纬度’、‘经度’]中的名称:
dim_src=ds_src.尺寸[名称]
ds_dest.createDimension(名称、尺寸)
var_src=ds_src.variables[名称]
var\u dest=ds\u dest.createVariable(名称,var\u src.datatype,(名称,)
var_dest[:]=var_src[:]
var_dest.setncattr('units',var_src.units)
变量dest.setncattr('long\u name',变量src.long\u name)
ds_dest.createDimension('时间',无)
var=ds_dest.createVariable('time',np.int32,('time',))
时间单位=‘1900-01-01 00:00:00后的小时数’
时间=格里高利
var[:]=date2num([d],单位=时间单位,日历=时间单位)
变量setncattr('单位',时间单位)
变量setncattr('long_name','time')
变量setncattr(“日历”,时间)
#变数
var=ds_dest.createVariable(var_tp.name,np.double,var_tp.dimensions)
变量[0,:,:]=数据
变量setncattr(“单位”,变量单位)
变量setncattr('long_name',变量tp.long_name)
#属性
ds_dest.setncattr(‘约定’、‘CF-1.6’)
ds_dest.setncattr('history','%s%s'
%(datetime.now().strftime(“%Y-%m-%d%H:%m:%S”),
''.join(time.tzname)))
打印('完成!每日总降水量保存在%s中'%f\u out)
我想要的是一个代码,它将遵循与上述数据相同的步骤,但假设我有一个包含一年houly数据的输入文件,并将其转换为一年的每日数据。 结果应为全年计算变量(如降水量等)的每日值

例如:假设我有一个全年的降雨量数据,每天为1mm/hr,那么全年的降雨量数据为2928

我想要的是全年24毫米/天,非闰年只有365个值

示例输入数据集:可从此处下载数据子集(2017年1月1日和2日)。只需使用后面的第二个脚本来检查代码。{全年代码>10GB,因此无法上传

“提前感谢”

正是您的工具。它在一行中将netCDF数据从一个时间分辨率(例如每小时)转换为另一个时间分辨率(例如每天)。使用您的示例数据文件,我们可以使用以下代码创建每日平均值:

import xarray as xr

ds = xr.open_dataset('./tp_20170101-20170102.nc')
tp = ds['tp'] # dimensions [time: 48, latitude: 721, longitude: 1440]
tp_daily = tp.resample(time='D').mean(dim='time') # dimensions (time: 2, latitude: 721, longitude: 1440)
您将看到,
resample
命令接收一个时间代码,在本例中,
'D'
表示每天,然后我们指定要使用当天的小时数据计算每天的平均值,使用
.mean(dim='time')

例如,如果您想计算每日最大值而不是每日平均值,则应将
.mean(dim='time')
替换为
.max(dim='time')
。您还可以
cdo daysum -shifttime,-1hour era5_hourly.nc era5_daily.nc