29、号外!号外!ERA5再分析数据下载方式更新啦

1. 前言

最近,更新ERA5月尺度再分析数据时,发现页面上出现了下面的提示:
在这里插入图片描述
系统提示,从2024年9月份开始,原有的ERA5下载方式将停止工作,2024年9月份以后,需要使用CDS-Beta方式进行ERA5数据的下载。下面,将详细介绍如何使用CDS-Beta下载ERA5再分析数据,以及使用过程中可能会遇到的问题。

2. 账号注册与协议签署

2.1 账号注册

注册链接:https://www.ecmwf.int/
在这里插入图片描述
点击右上角Log in进行注册,如果先前已经注册过账号,直接登录即可。
在这里插入图片描述
在这里插入图片描述
完成注册后,请登录账号。已有账号,请直接登录。

2.2 签署CDS-Beta使用条款

签署链接:https://cds-beta.climate.copernicus.eu/
初次登录账号后,将会看到:在这里插入图片描述

根据提示,填写相关信息,更新使用条款。

2.3 更新.cdsapi文件

链接:https://cds-beta.climate.copernicus.eu/how-to-api
在这里插入图片描述
将红色方框中的内容复制到原有的.cdsapi文件中,.cdsapi文件的通常路径为:C:\\Users\\user_name目录下,其中user_name为自己设备的用户名。

更加详细的使用方法,请参考:https://confluence.ecmwf.int/display/CKB/How+to+install+and+use+CDS+API+on+Windows

3. 常见问题与解决方法(持续更新中)

3.1 问题1:更新完.cdsapi文件之后,原有下载代码不可以使用

解决方法:原有下载ERA5数据的脚本在CDS-Beta中已经不再适用,需要使用新的网站,获取新的数据下载命令,进而进行下载。
CDS-Beta数据下载网址:https://cds-beta.climate.copernicus.eu/datasets
在这里插入图片描述
数据筛选过程与原有方式类似,只是下载的代码发生了变化,新的代码例子展示:

import cdsapi

dataset = "reanalysis-era5-single-levels-monthly-means"
request = {
    'product_type': ['monthly_averaged_reanalysis'],
    'variable': ['10m_u_component_of_wind'],
    'year': ['1940'],
    'month': ['01'],
    'time': ['00:00'],
    'data_format': 'netcdf',
    'download_format': 'unarchived'
}

client = cdsapi.Client()
client.retrieve(dataset, request).download()

3.2 问题2: RuntimeError: 403 Client Error: required licences not accepted

第一次使用CDS-Beta的时候,会出现:

RuntimeError: 403 Client Error: required licences not accepted
required licences not accepted; please accept the following licences to proceed: {'id': 'licence-to-use-copernicus-products', 'revision': 12}

的错误。
解决方法:按照3.1问题1的步骤,同意相关条款即可
在这里插入图片描述

3.3 问题3:.cdsapi报错

解决方法:.cdsapi文件中url:和key:的两个冒号后面,不要有空格。

参考内容:

  1. ERA5数据官网下载之CDS-Beta升级方法和避坑指南!
  2. https://forum.ecmwf.int/t/the-new-climate-data-store-beta-cds-beta-is-now-live/3315/5
  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个示例代码,它演示了如何通过 C 语言来实现基本资料数据的维护管理,包括添加、修改、删除和查询。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_EMPLOYEES 100 // 定义员工结构体 struct Employee { int id; // 职工 char name[50]; // 姓名 char gender[10]; // 性别 char department[50]; // 部门 char position[50]; // 岗位 int years_of_service; // 工龄 }; // 定义全局变量,存储员工信息 struct Employee employees[MAX_EMPLOYEES]; int num_employees = 0; // 声明函数 void add_employee(); void add_employees(); void modify_employee(); void delete_employee(); void query_employee(); void print_employee(struct Employee employee); int main() { int choice; while (1) { printf("\n1. Add employee\n"); printf("2. Add employees\n"); printf("3. Modify employee\n"); printf("4. Delete employee\n"); printf("5. Query employee\n"); printf("6. Exit\n"); printf("Enter your choice: "); scanf("%d", &choice); switch (choice) { case 1: add_employee(); break; case 2: add_employees(); break; case 3: modify_employee(); break; case 4: delete_employee(); break; case 5: query_employee(); break; case 6: exit(0); default: printf("Invalid choice.\n"); } } return 0; } // 添加单个员工 void add_employee() { struct Employee employee; printf("\nEnter employee ID: "); scanf("%d", &employee.id); printf("Enter employee name: "); scanf("%s", employee.name); printf("Enter employee gender: "); scanf("%s", employee.gender); printf("Enter employee department: "); scanf("%s", employee.department); printf("Enter employee position: "); scanf("%s", employee.position); printf("Enter employee years of service: "); scanf("%d", &employee.years_of_service); employees[num_employees] = employee; num_employees++; printf("Employee added successfully.\n"); } // 添加多个员工 void add_employees() { int num_employees_to_add; printf("\nEnter the number of employees to add: "); scanf("%d", &num_employees_to_add); for (int i = 0; i < num_employees_to_add; i++) { printf("\nEnter employee #%d information:\n", i + 1); add_employee(); } } // 修改员工信息 void modify_employee() { int id_to_modify; int found = 0; printf("\nEnter employee ID to modify: "); scanf("%d", &id_to_modify); for (int i = 0; i < num_employees; i++) { if (employees[i].id == id_to_modify) { printf("Enter employee name: "); scanf("%s", employees[i].name); printf("Enter employee gender: "); scanf("%s", employees[i].gender); printf("Enter employee department: "); scanf("%s", employees[i].department); printf("Enter employee position: "); scanf("%s", employees[i].position); printf("Enter employee years of service: "); scanf("%d", &employees[i].years_of_service); printf("Employee modified successfully.\n"); found = 1; break; } } if (!found) { printf("Employee not found.\n"); } } // 删除员工 void delete_employee() { int id_to_delete; int found = 0; printf("\nEnter employee ID to delete: "); scanf("%d", &id_to_delete); for (int i = 0; i < num_employees; i++) { if (employees[i].id == id_to_delete) { for (int j = i; j < num_employees - 1; j++) { employees[j] = employees[j + 1]; } num_employees--; printf("Employee deleted successfully.\n"); found = 1; break; } } if (!found) { printf("Employee not found.\n"); } } // 查询员工信息 void query_employee() { int id_to_query; int found = 0; printf("\nEnter employee ID to query: "); scanf("%d", &id_to_query); for (int i = 0; i < num_employees; i++) { if (employees[i].id == id_to_query) { print_employee(employees[i]); found = 1; break; } } if (!found) { printf("Employee not found.\n"); } } // 打印员工信息 void print_employee(struct Employee employee) { printf("\nEmployee ID: %d\n", employee.id); printf("Employee name: %s\n", employee.name); printf("Employee gender: %s\n", employee.gender); printf("Employee department: %s\n", employee.department); printf("Employee position: %s\n", employee.position); printf("Employee years of service: %d\n", employee.years_of_service); } ``` 在上面的示例代码中,我们首先定义了一个员工结构体来表示员工的基本资料数据。然后,我们定义了一个全局变量 `employees` 数组来存储所有员工的信息,以及一个变量 `num_employees` 来记录员工数量。接下来,我们实现了四个函数,分别用于添加单个员工、添加多个员工、修改员工信息和删除员工。最后,我们实现了一个查询员工信息的函数,并且使用 `switch` 语句来调用这些函数。 请注意,上面的代码仅提供了一个示例。在实际应用中,您可能需要添加更多的错误检查和输入验证,以确保输入的数据是有效和安全的。同时,您需要将员工信息保存到文件中,并在程序启动时从文件中读取员工信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱转呼啦圈的小兔子

觉得文章不错?请小编喝杯咖啡吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值