主要参考了这篇文章
网站注册后点击这里查看url和key
我增加了定义时间段的部分和保存文件名的部分。
以下是代码
import datetime
import time
from datetime import timedelta
import pandas as pd```
def get_time_df(start_time_btc,end_time_btc):
#转换为世界时
start_time_t_utc = datetime.datetime.strptime(start_time_btc,'%Y.%m.%d.%H')-timedelta(hours = 8)
end_time_t_utc = datetime.datetime.strptime(end_time_btc,'%Y.%m.%d.%H')-timedelta(hours = 8)
#计算有多少时次
n = (end_time_t_utc - start_time_t_utc).seconds/3600+1
#生成间隔一小时、世界时的时间序列
time_s = pd.date_range(start=start_time_t_utc,periods=n,freq='H')
#生成时间序列df
time_df = pd.DataFrame({'时间戳(世界时)':time_s})
#得到年月日时列
time_df['年'] = time_df['时间戳(世界时)'].apply(lambda x: str(x.year).zfill(4))
time_df['月'] = time_df['时间戳(世界时)'].apply(lambda x: str(x.month).zfill(2))
time_df['日'] = time_df['时间戳(世界时)'].apply(lambda x: str(x.day).zfill(2))
time_df['时'] = time_df['时间戳(世界时)'].apply(lambda x: str(x.hour).zfill(2)+':00')
#返回
return time_df
def download_ERA5(data_type,time_df):
import cdsapi
import urllib3
urllib3.disable_warnings()
c = cdsapi.Client()
for i in range(len(time_df)):
year = time_df.loc[i,'年']
mon = time_df.loc[i,'月']
day = time_df.loc[i,'日']
hour = time_df.loc[i,'时']
#逐文件下载
c.retrieve(
data_type,
{
'format': 'netcdf',
'variable': [
'10m_u_component_of_wind', '10m_v_component_of_wind', 'total_precipitation',
],
'year': year,
'month': mon,
'day': day,
'time':hour,
},
'CDS%s%s%s%s.nc'% (year,mon,day,hour.split(':')[0]))
if __name__ == "__main__":
#设置下载的起始时间,北京时
start_time_btc = '2021.03.23.00'
end_time_btc = '2021.03.23.08'
#生成时间df
time_df = get_time_df(start_time_btc,end_time_btc)
#设置资料类型
data_type = 'reanalysis-era5-land'
#下载
download_ERA5(data_type,time_df)
该代码段展示了一个Python脚本,用于从欧洲中期天气预报中心(ECMWF)的CDS API下载ERA5再分析陆地数据。脚本首先定义了时间范围,并生成相应的时间序列DataFrame。然后,通过遍历时间序列,调用CDSAPI逐小时下载指定类型的气象数据(如风速、风向和降水量)并保存为NetCDF文件。
2万+

被折叠的 条评论
为什么被折叠?



