批量下载ERA5数据

批量下载ERA5数据


文章目录


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、ERA5数据介绍

ERA5数据是ERA5官网

二、下载步骤

1.生成下载示例代码

代码如下(示例):

bash 复制代码
import cdsapi

dataset = "reanalysis-era5-pressure-levels-monthly-means"
request = {
    "product_type": ["monthly_averaged_reanalysis"],
    "variable": ["geopotential"],
    "pressure_level": ["300"],
    "year": [
        "1971", "1972", "1973",
        "1974"
    ],
    "month": [
        "01", "02", "03",
        "04", "05", "06",
        "07", "08", "09",
        "10", "11", "12"
    ],
    "time": ["00:00"],
    "data_format": "grib",
    "download_format": "unarchived"
}

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

2.生成批量下载的链接

代码如下(示例):

python 复制代码
import os
import logging
import argparse
import cdsapi

# Configure logging
logging.basicConfig(filename="download.log", level=logging.INFO,
                    format="%(asctime)s - %(levelname)s - %(message)s")

# Initialize CDS API client
c = cdsapi.Client()

# Function to make CDS API request
def cdsapi_request(var, year, area=None):
    if area is None:
        # Set to global area: North, West, South, East
        area = [90, -180, -90, 180]
    dataset = "derived-era5-single-levels-daily-statistics"
    request = {
        "product_type": "reanalysis",
        "variable": [var],
        "year": year,
        "month": [f"{m:02d}" for m in range(1, 13)],
        "day": [f"{d:02d}" for d in range(1, 32)],
        "daily_statistic": "daily_sum",
        "time_zone": "utc+00:00",
        "frequency": "1_hourly",
        "area": area,
        "format": "netcdf"
    }
    try:
        r = c.retrieve(dataset, request)
        file_name = f"ERA5_{var}_{year}_daily_sum.nc"
        logging.info(f"Request prepared for variable: {var} year: {year}")
        return r.location, file_name
    except Exception as e:
        logging.error(f"CDS API request failed for {var} {year}: {e}")
        raise

# Save download links and filenames
def save_download_info(var, data_path, data_name, output_dir):
    try:
        with open(os.path.join(output_dir, f"{var}_data_path.txt"), "a") as f:
            f.write(data_path + "\n")
        with open(os.path.join(output_dir, f"{var}_data_name.txt"), "a") as f:
            f.write(data_name + "\n")
        logging.info(f"Saved link and file name for {var}: {data_name}")
    except Exception as e:
        logging.error(f"Error saving download info for {var}: {e}")
        raise

# Main function
def main():
    parser = argparse.ArgumentParser(description="Generate ERA5 download links and filenames for each year.")
    parser.add_argument("-v", "--variables", nargs="+", required=True, help="List of variables to download")
    parser.add_argument("-y", "--years", nargs="+", default=[str(y) for y in range(1980, 2006)], help="Years to download")
    parser.add_argument("-o", "--output_dir", default="E:/dataset/ERA5/daily/globe", help="Output directory for downloaded files")
    parser.add_argument("-a", "--area", nargs=4, type=float, help="Bounding box: N W S E (e.g. 90 -180 -90 180 for global)")

    args = parser.parse_args()

    if not os.path.exists(args.output_dir):
        os.makedirs(args.output_dir)

    for var in args.variables:
        for year in args.years:
            try:
                url, file_name = cdsapi_request(var, year, area=args.area)
                save_download_info(var, url, file_name, args.output_dir)
            except Exception as e:
                logging.error(f"Error generating download info for {var} {year}: {e}")

if __name__ == "__main__":
    main()
c 复制代码
调用示例:
python 复制代码
python ERA5dowanload.py 

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

相关推荐
心静财富之门8 分钟前
Python 数据共享四种方案完整实例(同进程 / JSON / Redis / HTTP)
数据库·python·oracle
王仔小奶38 分钟前
慢SQL治理与性能调优:DBA如何用Shell/Python提升运维效率?
python·sql·dba
用户03321266636742 分钟前
使用 Python 快速在 PowerPoint 中生成表格【教程】
python
夜晚回家1 小时前
Python 身份运算符详解 | is 与 == 到底差在哪
python
fengye2071611 小时前
cpython框架结构
python
用户91294046848421 小时前
大模型返回 JSON 后,先过这道 Python 校验
python
Dmz丶1 小时前
前端转 AI 100 天 Day 32:LLM 客户端工程化——重试、超时、降级、限流
python
曲径海盗2 小时前
【Python 学习第 39 天】for 循环
python·学习笔记·编程入门
万联WANFLOW2 小时前
Kimi K3.1 Pro 接口接入指南:模型选型、费用计算与零数据保留
java·spring boot·python·安全·spring·大模型
问心无愧05133 小时前
[护网杯 2018]easy_tornado
python·tornado