python批量下载怀俄明大学探空数据Wyoming soundings并处理

news2025/1/16 5:41:16

下载怀俄明大学的探空数据,之前用的是气象家园写的maltab脚本,但总是链接不上,而且有的站点需要用新网址,有的有需要用老网址,很麻烦,痛定思痛用决定终于用python了,主要有两种方式,各有各的优缺点吧,我们下面逐一介绍一下。

数据概况

怀俄明大学的探空数据下载网址在:http://weather.uwyo.edu/upperair/seasia.html
中国地区的网址似乎放在了新的地方:http://weather.uwyo.edu/upperair/bufrraob.shtml 数据改成了BUFF格式,不过我看了下,新网址的数据垂直分辨率更高,质量更好更全,但站点较少,我所需要的北极地区站点数据不全,因此我还是选择在老站点下载。
老站点下载需要手动选择站点和日期,随后跳转到一个网页,一般是TEXELIST,这个网址是不提供下载页面的,如果数据较少,我们直接copy到txt或者excel里就好,如果数据较多,则需要借助脚本下载。
一个典型的探空数据其内容如下:

<HTML>
<TITLE>University of Wyoming - Radiosonde Data</TITLE>
<BODY BGCOLOR="white">
<H2>21432  Ostrov Kotelnyj Observations at 12Z 07 Jan 2019</H2>
<PRE>
-----------------------------------------------------------------------------
   PRES   HGHT   TEMP   DWPT   RELH   MIXR   DRCT   SKNT   THTA   THTE   THTV
    hPa     m      C      C      %    g/kg    deg   knot     K      K      K 
-----------------------------------------------------------------------------
 1015.0      8  -36.1  -39.3     72   0.13    155      8  236.0  236.4  236.1
 1000.0    124  -33.1  -35.7     77   0.18    170      8  240.1  240.6  240.1
  996.0    152  -32.1  -34.5     79   0.21    170      8  241.4  241.9  241.4
  977.0    288  -27.1  -29.0     84   0.36    171      9  247.7  248.7  247.8
  952.0    474  -25.5  -26.8     89   0.45    173     11  251.2  252.4  251.2
  947.0    512  -25.3  -26.9     86   0.45    173     12  251.7  253.0  251.8
  925.0    681  -25.3  -27.7     80   0.43    175     14  253.4  254.7  253.5
  850.0   1294  -27.3  -30.0     78   0.38    185     19  257.5  258.6  257.6
  770.0   2002  -29.1  -33.7     64   0.29    185     27  263.0  263.9  263.0

本次使用python下载数据,主要使用两种方式:urlib和siphon

urlib下载

这个数据的下载思路很简单,就是根据时间和站点构建数据网址,利用urlib.request得到内容,将所有数据写入txt文件再保存:

import urllib.request
import os
import calendar
url0='http://weather.uwyo.edu/cgi-bin/sounding?region=ant&TYPE=TEXT%3ALIST&'
stids=['21432',]
hrs='00'
hre='12'
hr=['00','12']
for stname in stids:
    path='D:/arctic-in-situ/uwyo_sounding/stn_'+stname+'/'
    if os.path.isdir(path):
          pass
    else:
          os.mkdir(path)
    for y in range(2019, 2021):
        yr=str(y)
        for m in range(1, 13): 
            if m<10 :
                mn='0'+str(m)
            else:
                mn=str(m) 
            day_num = calendar.monthrange(y, m)[1] 
            for d in range(1,day_num+1):
                if d<10:
                    dy="0"+str(d)
                else:
                    dy=str(d)
                for h in hr:
                    url=url0+'YEAR='+yr+'&MONTH='+mn+'&FROM='+dy+h+'&TO='+dy+h+'&STNM='+stname
                    try:
                        print(url)
                        resp=urllib.request.urlopen(url)
                        html=resp.read()
                        fname=path+stname+'-'+yr+mn+dy+h+'.txt'
                        file=open(fname,'w')
                        file.write(str(html,"utf-8"))
                        file.close()
                        print(fname)
                    except Exception:
                        print("下载失败")      
           

这个方法的好处是非常直接,处理也比较简单,再处理时,我直接使用pandas库的read,table对其处理即可:data[i]=pd.read_table(file_list[i],sep='\s+',header=None,skiprows=9,skipfooter=1,names=['P','HT','TEMP','DWPT','RH','Q','DRCT','WS','THTA','THTE','THTV'] ,engine='python')
即可读取。

Siphon下载——添加混合比

iphon是pyhton语言写的一个工具包,可以用来下载预报数据、再分析数据以及怀俄明的探空数据,其官方文档就有下载怀俄明大学探空数据的例子:Siphon_upper_Air
之前已有一位大佬的博客讲述了如何使用Siphon批量下载的配置和代码Python下载Wyoming怀俄明大学探空数据,极具参考意义,不过由于需求与版本不同,在实际使用时会存在差异。
在我使用时,Siphon内默认下载网址可以正常使用,因此我跳过了数据网址更新步骤,添加代理部分我直接使用了自己的全局魔法(。),也并没有修改。
不过这里存在一个问题:Siphon默认下载的探空数据是不包含水汽混合比和位温的,需要我们进行一些修改。
进入你的Siphon下载路径,我的是在D:\Anaconda\Lib\site-packages文件夹,可以用pip show Siphon查看安装路径。
在这里插入图片描述

进入simplewebservice文件夹,有个wyoming.py文件,进去,找到def _get_data,修改为:

 def _get_data(self, time, site_id):
        r"""Download and parse upper air observations from an online archive.

        Parameters
        ----------
        time : datetime
            The date and time of the desired observation.

        site_id : str
            The three letter ICAO identifier of the station for which data should be
            downloaded.

        Returns
        -------
            :class:`pandas.DataFrame` containing the data

        """
        raw_data = self._get_data_raw(time, site_id)
        soup = BeautifulSoup(raw_data, 'html.parser')
        tabular_data = StringIO(soup.find_all('pre')[0].contents[0])
        col_names = ['pressure', 'height', 'temperature', 'dewpoint', 'mixr', 'direction', 'speed']
        df = pd.read_fwf(tabular_data, skiprows=5, usecols=[0, 1, 2, 3, 5, 6, 7], names=col_names)
        df['u_wind'], df['v_wind'] = get_wind_components(df['speed'],
                                                         np.deg2rad(df['direction']))

        # Drop any rows with all NaN values for T, Td, winds
        df = df.dropna(subset=('temperature', 'dewpoint', 'mixr', 'direction', 'speed',
                               'u_wind', 'v_wind'), how='all').reset_index(drop=True)

        # Parse metadata
        meta_data = soup.find_all('pre')[1].contents[0]
        lines = meta_data.splitlines()

        # If the station doesn't have a name identified we need to insert a
        # record showing this for parsing to proceed.
        if 'Station number' in lines[1]:
            lines.insert(1, 'Station identifier: ')

        station = lines[1].split(':')[1].strip()
        station_number = int(lines[2].split(':')[1].strip())
        sounding_time = datetime.strptime(lines[3].split(':')[1].strip(), '%y%m%d/%H%M')
        latitude = float(lines[4].split(':')[1].strip())
        longitude = float(lines[5].split(':')[1].strip())
        elevation = float(lines[6].split(':')[1].strip())
        pw = float(lines[-1].split(':')[1].strip())

        df['station'] = station
        df['station_number'] = station_number
        df['time'] = sounding_time
        df['latitude'] = latitude
        df['longitude'] = longitude
        df['elevation'] = elevation
        df['pw'] = pw

        # Add unit dictionary
        df.units = {'pressure': 'hPa',
                    'height': 'meter',
                    'temperature': 'degC',
                    'dewpoint': 'degC',
                    'mixr': 'g/kg',
                    'direction': 'degrees',
                    'speed': 'knot',
                    'u_wind': 'knot',
                    'v_wind': 'knot',
                    'station': None,
                    'station_number': None,
                    'time': None,
                    'latitude': 'degrees',
                    'longitude': 'degrees',
                    'elevation': 'meter',
                    'pw': 'millimeter'}
        return df

主要是将水汽混合比保存读取,保存运行,下载的数据变多了水汽混合比这一列:
在这里插入图片描述
代码如下,主要参考上述提到的博客python批量下载Wyoming代码:

import os
from datetime import datetime
import datetime as dt
from metpy.units import units
from siphon.simplewebservice.wyoming import WyomingUpperAir


# 设置下载时段(这里是UTC时刻)
start = datetime(2019, 3, 1, 0)
end = datetime(2019, 8, 31, 0)
datelist = []
nodata=[]
data_missing=[]
while start<=end:
    datelist.append(start)
    start+=dt.timedelta(hours=12)
datelist_s=[]
stids=['21432',]
for stname in stids:
    path='D:/arctic-in-situ/uwyo_sounding/'+stname+'/'
    if os.path.isdir(path):
          pass
    else:
          os.mkdir(path)
    datelist_s=datelist.copy()
    for date in datelist_s:
        try:
            df = WyomingUpperAir.request_data(date, stname)
            df.to_csv(path+date.strftime('%Y%m%d%H')+'.csv',index=False)
            print(stname+date.strftime('%Y%m%d_%H')+'下载成功')
        except Exception as e:
            print('错误类型是',e.__class__.__name__)
            print('错误明细是',e)
            print(stname+date.strftime('%Y%m%d_%H')+'下载失败,原因如下:')
            if e.__class__.__name__=="IndexError":
                #加入无数据队列
                print(
                    'No data available for {time:%Y-%m-%d %HZ} '
                    'for station {stid}.'.format(time=date, stid=stname))
                nodata.append(stname+'_'+date.strftime('%Y%m%d%H'))

            elif e.__class__.__name__=="TypeError":
                print('Error data type in web page')
                nodata.append(stname + '_' + date.strftime('%Y%m%d%H'))
            elif e.__class__.__name__=="KeyError":
                print('Missing data in web page')
                data_missing.append(stname + '_' + date.strftime('%Y%m%d%H'))
                # 其他需要忽略下载的错误可以继续往下加


            else:
                print('等待重新下载'+stname+date.strftime('%Y%m%d_%H'))
                datelist_s.append((date))


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nightingale-0-介绍单机二进制部署

(一) 夜莺介绍 Nightingale | 夜莺监控&#xff0c;一款先进的开源云原生监控分析系统&#xff0c;采用 All-In-One 的设计&#xff0c;集数据采集、可视化、监控告警、数据分析于一体&#xff0c;与云原生生态紧密集成&#xff0c;提供开箱即用的企业级监控分析和告警能力。于…

渗滤液除氨氮、矿井水除氨氮,氨氮吸附技术

垃圾渗滤液是生活垃圾的必然产物&#xff0c;顾名思义&#xff0c;垃圾渗滤液是指来源于垃圾填埋场中垃圾本身含有的水分、进入填埋场的雨雪水及其他水分&#xff0c;扣除垃圾、覆土层的饱和持水量&#xff0c;并经历垃圾层和覆土层而形成的一种高浓度的有机废水。垃圾在堆放和…

[golang gin框架] 24.Gin 商城项目-redis讲解以及操作

一.reids相关文章 Redis五种数据类型及其应用场景 REDIS中的缓存穿透&#xff0c;缓存击穿&#xff0c;缓存雪崩原因以及解决方案 redis实现用户签到&#xff0c;统计活跃用户&#xff0c;用户在线状态&#xff0c;用户留存率 [golang gin框架] 12.Gin 商城项目-base64Captcha生…

KDXJ-8 SF6气体泄漏报警在线检测系统

一、功能特点 1. 定量测量SF6&#xff08;六氟化硫&#xff09;气体浓度&#xff1b; 2. 定量测量O2&#xff08;氧气&#xff09;气体浓度&#xff1b; 3. 定量测量大气温湿度&#xff1b; 4. 可根据需要设置SF6和O2气体浓度的报警点&#xff1b; 5. 后台监控&#xff1b; 6.…

【通过加载plist文件显示分组数据 Objective-C语言】

一、展示汽车品牌数据 1.首先,我们还是先把控制器调成3.5英寸,再把模拟器调成iPhone4S, 2.然后呢,我们要先把素材拷进来, 我们要展示,要把一个plist文件中的数据展示到我们的这个UITableView里面,所以说,首先,是要把我们的plist文件拷进来, 找到我们这个plist文件…

爱智EdgerOS之深入解析在爱智应用中如何使用Socket.IO轻松实现双向通信

一、什么是 Socket.IO&#xff1f; Socket.IO 是一个基于事件通信的实时应用程序框架&#xff0c;它在即时通讯、通知和消息推送&#xff0c;实时分析等场景中有广泛的应用。Socket.IO 包括两个部分&#xff1a; 在 Server 端的模块&#xff08;JSRE 已提供了 socket.io 模块&…

Onnx 转Ncnn

Onnx 转Ncnn 算法工程师给了onnx,需要转成ncnn才能用到安卓上去&#xff0c;步骤如下 简化onnx 算法给了.onnx后缀的文件&#xff0c;100多兆&#xff0c;太大&#xff0c;第一步&#xff0c;先简化&#xff1a; conda env list 查看conda环境&#xff08;前提是之前已经配…

企业级实践:分布式系统中的可靠消息最终一致性方案

背景 公司由于业务爆发式增长&#xff0c;新上了许多业务系统&#xff0c;例如&#xff1a;本地生活、社区团购、旅投B2B、旅投B2C等系统&#xff1b;同时&#xff0c;由于业务系统越来越多&#xff0c;为了运营方便&#xff0c;把分销、营销、订单、会员等多个业务系统公共业…

Babel零基础教程

参考https://www.jiangruitao.com/babel/ 写的非常好&#xff0c;本人只是为了方便查找&#xff0c;记录在自己博客上&#xff0c;原文可以去该链接拜读 1、 Babel 简介 Babel是什么&#xff1f; Babel是一个工具集&#xff0c;主要用于将ES6版本的JavaScript代码转为ES5等向…

遗传算法的概念和python实现

遗传算法是一个非常经典的智能算法&#xff0c;主要用于解决优化问题。本文主要简单介绍一些原理&#xff0c;同时给出一个基于python实现的&#xff0c;用于解决实数内优化问题的模板。 本文参考&#xff1a; 原理&#xff1a;遗传算法入门详解 - 知乎 简单介绍 遗传算法就…

服务型企业如何使用飞项实现项目化管理?

服务型企业的业务模式一般都是按项目来运作的&#xff0c;其业务分为售前&#xff0c;售中和售后三个阶段&#xff0c;分别由不同部门和人员对客户进行个性化服务。在这个过程中需要对人、流程和知识的高效统筹管理&#xff0c;即项目的整体管理&#xff0c;因此存在着不小的挑…

Nvidia Jetson Orin: SPE/AON Cortex-R5 固件开发

Nvidia Jetson Orin: SPE/AON Cortex-R5 固件开发 写在最前边开发/下载 SPE 固件关于修改DTS 写在最前边 SPE 只能控制 AON GPIO 最多32个PIN 开发/下载 SPE 固件 S1&#xff1a;打开 https://developer.nvidia.com/embedded/jetson-linux S2&#xff1a;这里下载 S3&#x…

Linux环境使用日志切割工具-cronolog

Linux环境使用日志切割工具 需明白的点&#xff1a;1.安装 2.如何使用 一、安装cronolog 1.首先检查是否存在cronolog 命令&#xff1a;whereis cronolog 或 which cronolog 2.不存在则安装 安装方式&#xff1a; a.yum 安装&#xff1a;yum install cronolog b. 源码安装&am…

C/C++|物联网开发入门+项目实战|指针|嵌入式C语言高级|C语言内存空间的使用-数组-学习笔记(10)

参考&#xff1a;麦子学院-嵌入式C语言高级-内存空间 2-3 : C语言内存空间的使用-数组 内存分配的一种形式 数组的定义及初始化 定义一个空间: 1、大小 2、读取方式 数组名[]:升级为连续空间的名称&#xff0c; [m]的作用域只在申请的时候起作用 每个多大&#xff1f;数组…

太给力了,这款java表单设计器可提高办公协作效率!

随着办公自动化的快速发展&#xff0c;java表单设计器的应用价值和突出优势也逐渐成为企业提高办公效率的好帮手。传统的表单操作起来费时费力&#xff0c;效率不高&#xff0c;逐渐满足不了日益繁多的业务需求了&#xff0c;在广大用户的呼声和市场发展下&#xff0c;简洁、灵…

ESP32学习五-启动流程

一、简介 在ESP32的开发中&#xff0c;通常我们会从app_main函数中开始我们的代码开发。但是为什么是app_main呢&#xff1f;app_main又是从哪里被调用的&#xff1f;app_main之前又做了什么操作呢&#xff1f;今天我们就来详细分析一下。 官方参考文档&#xff1a;应用程序的启…

柔性作业车间生产调度中MK算例文本各行数字表示的含义以及算例的数据

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 MK算例其他MK02~MK10柔性作业车间数据 MK算例 Brandimarte给出了10组柔性作业车间的实例分别是MK01~Mk10&#xff0c;下方即为MK01的实例数据 10 6 26 2 1…

Kubernetes Operator开发

Kubernetes Operator开发 1.kubebuilder 创建项目 2.Crontroller开发与部署 开发环境准备 kubebuilder 介绍 CRD的开发与部署 Crontroller开发与部署 Operator功能设计 借助operator完成 和企业内部注册中心打通 这里以Traefiketcd的模式为例进行演示说明 在这里etcd provi…

现在学习云计算,还有出路吗?

现在学习云计算&#xff0c;还有出路吗&#xff1f; 当然有出路&#xff0c;现在正是学习云计算的好时机。只要你专业技术过关&#xff0c;有一定的项目经验&#xff0c;有的企业甚至接受应届生&#xff1b;其次是具备一定的职业素养&#xff0c;学历在大专及以上&#xff0c;年…

潇洒郎: git配置、拉取、提交代码

git配置拉取代码 git 配置全局变量 git config --global user.name "xuxiaosa" git config --global user.email "xuxiaosamigu.cn" 配置ssh key 1、打开git-bash 输入ssh-keygen 一直回车&#xff0c;会提示文件保存的地址 id_rsa,id_rsa.pub两个文…