找回密码
 立即注册
搜索
查看: 1530|回复: 29

【Python】简单的Python处理气象数据的教程

[复制链接]

2

主题

36

回帖

252

积分

热带低压

积分
252
发表于 2024-4-6 18:35 | 显示全部楼层 |阅读模式
本帖最后由 bala 于 2024-4-6 23:56 编辑

        本贴主要内容为Python的气象数据处理与可视化。

        python是一门很强大的语言,不像c c艹等语言容易头秃,python易学习易上手,库种类丰富拿来即用。例如我们的balabot的全部功能都是基于python开发。

        通过学习python基础,学习Python可视化的核心工具Matplotlib的工作原理,配合相关示例,讲解不同格式气象数据的处理工具与方法,绘制相关的气象常用图表,自己动手丰衣足食!。

        本贴感觉是一个巨坑,本人会在闲暇时间慢慢填坑,每天可能都会敲一点~

        该教程根据个人浅薄的经验总结,本人入坑时间也不长,错误遗漏难免较多,望有关大气、计算机、群除我佬等专业人士多给予本帖批评指正,本人也会不断学习相关知识,提高姿势水平。

评分

参与人数 1金钱 +10 威望 +10 收起 理由
nicedavid12138 + 10 + 10 优秀贴

查看全部评分

头秃

2

主题

36

回帖

252

积分

热带低压

积分
252
 楼主| 发表于 2024-4-6 19:38 | 显示全部楼层
本帖最后由 bala 于 2024-4-9 22:44 编辑

第一章 Python安装及环境搭建

注意:本环境默认为Windows环境。linux环境我也不太熟,可咨询其他大佬。
1.首先下载python,官网是https://www.python.org/(网页打不开跳转至下面一段),找到Downloads,选择Windows,然后你会看到很多个版本。首先看版本,x86-64是64位版本,x86是32位版本,你需要下载跟你电脑系统一致的版本。我们建议不要使用超过3.11.xx版本,原因后面会说。还有每个版本后写着“Note that Python 3.12.1 cannot be used on Windows 7 or earlier.”意思是这个版本不支持win7或更早的系统。Win10用户我们建议下载3.10.xx。
可能很多人这一步就会卡住,因为不可抗力的原因有时候访问外网会显示访问失败,我们可以访问镜像源https://registry.npmmirror.com/binary.html?path=python/,我们选择一个3.10.xx,进入后选择python-3.10.xx-amd64.exe,点击后会自动下载。

2.安装Python。安装比较简单,双击后打开。看下面图。

3.安装完成后win+r键打开“运行”窗口,输入“cmd”,在黑框框里面输入“python”,如果出来一堆
  1. Python 3.10.11 (tags/v3.10.11:7d4cc5a, Apr  5 2023, 00:38:17) [MSC v.1929 64 bit (AMD64)] on win32
  2. Type "help", "copyright", "credits" or "license" for more information.
复制代码

之类的说明安装成功了,如果出现“python不是内部或外部命令”说明安装失败,可百度或在本楼下回复帮助解决。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
头秃

2

主题

36

回帖

252

积分

热带低压

积分
252
 楼主| 发表于 2024-4-6 19:59 | 显示全部楼层
本帖最后由 bala 于 2024-4-9 22:46 编辑

第二章 开发环境推荐

开发环境意思就是你要在哪个地方写代码。下面介绍几种集成开发环境:
1.python自带了一个专门写python代码的地方--->IDLE shell,打开方式为 点击左下角开始-->往下翻到P字母开头的找到Python文件夹-->IDLE,缺点很多,比如界面特别丑、空格经常出问题,没有提示等等(推荐指数0昏)

2.VScode是微软开发的敲代码的工具,不仅能写python,还能写其他的各种代码,界面可以自定义美化,还有很多比较方便的插件可以用,缺点是比较占用内存(推荐指数8分)

3.pycharm很好用,比较推荐(推荐指数8分)

4.Sublime Text,也很好用,比较推荐(推荐指数7分)

具体的可以去网上搜索一下,毕竟只是个工具,适合自己的才是最好的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
头秃

2

主题

36

回帖

252

积分

热带低压

积分
252
 楼主| 发表于 2024-4-6 20:17 | 显示全部楼层
第三章 Python基础

1.首先打开你所用的写代码的地方,本文以python自带的idle为例

新建一个 xx.py的文件,.py指的是python代码的文件的后缀,xx你想起什么名字都行。
在里面输入

  1. print("Hello World")
复制代码

然后下面会出来Hello World两个单词,说明你们代码运行成功了。

2.常用的功能
我们强烈建议先学习一下基础功能https://www.runoob.com/python3/python3-tutorial.html
或者廖雪峰 python 教程等等,学习不要急躁,不求每个知识点都记住、会用,但是当你遇到时起码有思路知道用哪个代码,大不了再去翻教程,盲目的急于求成会浪费很多时间

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
头秃

2

主题

36

回帖

252

积分

热带低压

积分
252
 楼主| 发表于 2024-4-6 20:39 | 显示全部楼层
本帖最后由 bala 于 2024-4-15 00:24 编辑

第四章 Python常用的库安装

python库是什么意思?库也可以叫包、模块、lib、library、package、module,这是一坨坨类、函数等构成的东西,说人话就是别人写好的代码包装成插件的形式,然后我们直接拿来用的东西(。打个比方,打游戏出装备,你可以用人家的一键出装,这个一键出装就相当于python的库。

绘图和数据处理常用的库有:

数据处理类:
numpy:Python 标准数学工具包
Pandas:提供高性能、易于使用的数据结构和数据分析工具
xarray:多维阵列分析工具,适用于地球科学中自描述科学数据类型。主要关注标签化表格数据。擅长处理 netCDF 数据,与 dask 紧密集成以并行计算
SciPy:用于数学、科学、工程领域的常用软件包
datatime:日期时间工具(lib\datatime.py)

可视化类:
Matplotlib:非常强大的数据可视化工具库,最常用的 pyplot 和MATLAB 很像
Basemap:用于制作地理基础图的工具包模块。2020 年停止维护
Cartopy:Python 的制图工具
VAPOR:面向海洋、大气、太阳研究者的可视化和分析平台。一个交互的三维可视化工具。对 WRF、MOM、POP 还有一些 GRIB、netCDF 数据可以直接导入
Bokeh:针对 Python 的交互式可视化库

气象专业类:
Metpy:读取、可视化和使用天气数据执行计算工具集合。建立在 Python 科学计算生态上的具备气象学特有功能的包
SkewT:绘制和分析高空探测数据
cinrad:py开发的读取绘制雷达基数据的包

地理信息类:
Shapely:用于操作和分析平面几何对象

库的安装:
最常用的为cmd窗口输入,win+r键打开运行窗口,输入cmd打开cmd窗口,输入pip install xxxx
比如你要安装pandas,你可以打开cmd后输入:pip install pandas

不怎么好装的有这几个:Cartopy,Pillow,pyproj,shapely。这几个可以采用手动安装,以cartopy为例方法如下:
1.首先打开cmd,输入pip install wheel
2.然后打开这个网站https://pypi.tuna.tsinghua.edu.cn/simple/找到cartopy条目,点进去
3.假如你的python安装的是3.10.x,那么就找到Cartopy-0.22.0-cp310-cp310-win_amd64.whl,点击下载。如果是3.9.x就下载cp39的那一个,3.11.x就下载cp311那一个。
因为很多库不支持新版本python,比如cartopy库最高就支持到3.11.x,不支持3.12.x,如果你安装了3.12的python就无法使用这些库。
4.找到你下载好的目录,按照图片所示输入cmd

5.安装指令的格式为pip install xxxx-x.x.x-cpxxx-cpxxx-win_amd64.whl,安装cartopy就输入 pip install Cartopy-0.20.2-cp310-cp310-win_amd64.whl

6.安装成功了

如果要卸载库,就使用pip uninstall xxxx

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
头秃

1

主题

11

回帖

163

积分

热带低压

积分
163
发表于 2024-4-6 20:43 | 显示全部楼层


Hi everybody!! I come from Vietnam, I want to read AVHRR data, can you help me? I read the HRPT tutorial before but the images were not good quality?

评分

参与人数 1威望 +25 收起 理由
红豆棒冰冰 + 25 欢迎新人

查看全部评分

2

主题

36

回帖

252

积分

热带低压

积分
252
 楼主| 发表于 2024-4-6 20:47 | 显示全部楼层
本帖最后由 bala 于 2024-4-9 23:01 编辑

第五章 常见的数据格式
1.BUFR:常用于国际交换的常规地面报、参与国际交换高空气象观测数据、参与国际交换的地面气候月报、参与国际交换的浮标数据、地面分钟观测数据、地面小时观测数据、气象辐射分钟观测数据等。
2.GRIB:常用于数值,比如GFS数值,可使用xarray库配合engine参数读取。
3.NetCDF:也就是常见的.nc格式,常用于各类气象观测数据、数值预报模式产品等以离散点和格点存储的数据文件。
4.HDF:常用于卫星数据。
5.其他格式例如csv,txt,html,json等

点评

补充:BUFR可用pybufr库读取,但索引较麻烦;GRIB数据使用xarray读取的前提是安装ECMWF开发的cfgrib库,也可以使用pygrib库直接读取,后者更常见  发表于 2024-4-6 22:28
头秃

0

主题

3

回帖

82

积分

热带扰动-TCFA

积分
82
发表于 2024-4-6 21:12 | 显示全部楼层
支持!!!

2

主题

36

回帖

252

积分

热带低压

积分
252
 楼主| 发表于 2024-4-6 22:34 | 显示全部楼层
本帖最后由 bala 于 2024-4-7 16:55 编辑

第六章 数据处理
1.文件处理
(1)文件打开与关闭
Python内置了open()方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出“OSError”。使用open()方法一定要保证关闭文件,即调用 close() 方法。
  1. open(file, mode='r', encoding=None, buffering=-1,errors=None, newline=None, closefd=True)
复制代码

file: 必需,文件路径(相对或者绝对路径)
mode: 可选,文件打开模式。默认采用text-mode读取文件,对于二进制文件,需要加入’b’,例如’br’
buffering: 设置缓冲
encoding: 一般使用 utf-8
errors: 报错级别
newline: 区分换行符
closefd: 传入的 file 参数类型

其中,mode模式有:r只读 w只写,w+读写且写入时覆盖原文件,a追加写入。详细请看菜鸟教程内置函数open()一栏https://www.runoob.com/python/python-func-open.html

关于文件路径问题,python的路径有点让人头大,我们习惯写全路径,而且路径内习惯性的将“\”替换为“/”,因为“\”一般用来转义的,详见https://www.runoob.com/python3/python3-string.html,有时候前面加了r,在读取shp文件时还是会报错,所以我们建议路径内尽量使用“/”
(2)文件读取
上面链接内包含了文件读取的教程
下面是一个文件读取的示例:
  1. f = open('D:/data/content.txt','r')#以只读模式打开文件
  2. con=f.read() #读入所有内容,作为一个字符串
  3. con=f.readline() #读入一行
  4. con=f.readlines() #读入所有内容,作为一个列表
  5. x = [c.replace('\n','') for c in con] #替换读入列表中的换行符,replace函数可参考[url=https://www.runoob.com/python/att-string-replace.html]https://www.runoob.com/python/att-string-replace.html[/url]
  6. f.close()
复制代码


(3)文件写入
f.write(str):将字符串写入文件,返回的是写入的字符长度。
f.writelines(sequence):向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符('\n')。
例如:
  1. with open('table.txt','w+') as f:  #打开table.txt文件,如果没有就创建了
  2.         for x in range(1, 11):   #创建一个1到10的列表
  3.                  f.writelines([repr(x).rjust(3), repr(x*x).rjust(4),repr(x*x*x).rjust(5), '\n']) #repr()和rjust()函数参考菜鸟教程
复制代码


(4)目录查询
我们建议将气象数据归集到一个文件夹内,且分级、分类明确,以便于我们查找。
对目录或者目录下的文件属性可以进行查询,使用到的是 os 库。

  1. import os
  2. curPath=os.getcwd() #获取当前工作路径
  3. a = os.listdir() #列举
  4. b = os.stat(r'E:/PythonTTTTTTest/code.txt') #获取文件属性
  5. c = os.path.getsize(r'E:/PythonTTTTTTest/code.txt') #获取文件大小
  6. d = os.path.exists(r'E:/PythonTTTTTTest/') #路径是否存在
  7. e = dirs,fileName=os.path.split(r'E:/PythonTTTTTTest/code.txt') #分割路径和文件名
  8. f = os.path.splitext(r'E:/PythonTTTTTTest/code.txt') #分离扩展名

  9. print(a,b,c,d,e,f)
复制代码


结果:
a输出的结果['02cfcdd006db46d28e57afd717b69469.xlsx', '1.jpg', '11111.txt', '11111.xlsx', '114.png', '2022shp', '2023030700-56187.csv', '2023数据', 'skewt.py', 'allwdt.png', 'bala', 'bala.py', 'chengduradar.py', 'cmacode.csv', 'cma日值.py', 'code.txt', 'code2.txt', 'cs.py', 'data.csv', 'data1.csv', 'day1.json', 'ddns资料', 'earthq.py', 'ECMWF.py', 'getStaidAllData.json', 'GFS', 'gocqhttp', 'group.json', 'guangdong.png', 'guangdong.py'] 我们看到是一个列表的形式
b输出的结果os.stat_result(st_mode=33206, st_ino=1688849860267275, st_dev=397963, st_nlink=1, st_uid=0, st_gid=0, st_size=4009, st_atime=1712415721, st_mtime=1681382328, st_ctime=1681382231)
c输出的结果4009
d输出的结果True
e输出的结果('E:/PythonTTTTTTest', 'code.txt')
f输出的结果('E:/PythonTTTTTTest/code', '.txt')

(5)创建与删除
同样的使用os库来进行创建于删除
  1. os.makedirs('123') #创建文件夹
  2. os.remove('abc.txt') #删除文件
  3. os.removedirs('123') #删除目录
复制代码

当我们批量输出数据时,我们可以判断目录是否存在的情况 os.path.exists(path),不存在就创建,存在则返回 False。
  1. import os
  2. def mkdir(path):
  3.     path=path.strip()
  4.     path=path.rstrip("\")
  5.     isExists=os.path.exists(path)
  6.     if not isExists:
  7.         os.makedirs(path)
  8.         print( path+' 创建成功')
  9.         return True
  10.     else:
  11.         print (path+' 目录已存在')
  12.         return False
  13. mkdir('Folder')
复制代码


(6)遍历
当我们有比较多的到处爬来的乱七八糟的气象数据时,我们可以使用os的遍历功能(比如os.listdir())获取某个目录下的所有文件。
例1:遍历文件夹获取 CSV 数据文件列表
  1. import os
  2. path = r'E:/PythonTTTTTTest' #指定文件所在路径
  3. filetype ='.csv' #指定文件类型
  4. name =[]
  5. for root,dirs,files in os.walk(path):
  6.     for i in files:
  7.         if filetype in i:
  8.             name.append(i.replace(filetype,''))#生成不带'.csv'后缀的文件名组成的列表
  9. files = [path+'\\'+item +'.csv' for item in name]#生成'.csv'后缀的文件名组成的列表
复制代码


粒2:使用glob库,以时间为通配符匹配筛选得到某一天的数据文件列表
  1. import glob
  2. pat='E:/PythonTTTTTTest/GFS/*20240320????.000'
  3. files=[]
  4. for file in glob.glob(pat):
  5.     files.append(file)
复制代码
头秃

2

主题

36

回帖

252

积分

热带低压

积分
252
 楼主| 发表于 2024-4-6 23:26 | 显示全部楼层
本帖最后由 bala 于 2024-4-7 11:08 编辑

截上一楼:
2.多维数据操作基础
本节中以基础的Numpy.ndarray 讲解类多维数据操作工具的使用方法

(1)常规方法创建数组

  1. import numpy as np
  2. #一维数组
  3. a=np.array([2,3,4])
  4. b=np.array([2.,3.,4.])
  5. #二维数组
  6. c=np.array([[1.,2.],[3.,4.]])
  7. print(a,a.dtype)
  8. print(b,b.dtype)
  9. print(c,c.dtype)
复制代码


结果:
[2 3 4] int32
[2. 3. 4.] float64
[[1. 2.]
[3. 4.]] float64

(2)利用函数创建
  1. np.arange(0,10,1,dtype=float) #arange 函数创建
复制代码

结果:[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
  1. np.ones((2,3,4),dtype=int) #创建 2 张 3 行 4 列的数据
复制代码

结果:
[[[1 1 1 1]
  [1 1 1 1]
  [1 1 1 1]]

[[1 1 1 1]
  [1 1 1 1]
  [1 1 1 1]]]
  1. np.zeros((2,3,4)) #创建 2 张 3 行 4 列的零矩阵
复制代码

结果
[[[0. 0. 0. 0.]
  [0. 0. 0. 0.]
  [0. 0. 0. 0.]]

[[0. 0. 0. 0.]
  [0. 0. 0. 0.]
  [0. 0. 0. 0.]]]
  1. np.linspace(70,180,5) #起点为70,终点为 180,取 5 个数
复制代码

结果:[ 70.   97.5 125.  152.5 180. ]
  1. np.random.randint(-9,3,(2,3))#生成两行三列,大小为[-9,3)之间(左闭右开)的随机整数
复制代码

结果:
[[ 1 -6 -3]
[ 0 -6 -4]]

(3)运算
①基本运算
  1. import numpy as np
  2. a = np.arange(2,6,1)
  3. b = np.array([1,2,4,6])
  4. print(a)
  5. print(b)
  6. print(a+b)#加法
  7. print(a-b)#减法
  8. print(a*b)#乘法
  9. print(a**2)#a的平方
  10. print(np.sin(a)*5)#三角函数
  11. print(a>3)#判断是否>3
  12. print(np.exp(a))#指数
复制代码

结果:
[2 3 4 5]
[1 2 4 6]   
[ 3  5  8 11]
[ 1  1  0 -1]
[ 2  6 16 30]
[ 4  9 16 25]
[ 4.54648713  0.70560004 -3.78401248 -4.79462137]
[False False  True  True]
[  7.3890561   20.08553692  54.59815003 148.4131591 ]
②统计运算
  1. import numpy as np
  2. a=np.random.randint(0,5,(2,3))
  3. print(a.sum(),a.sum(0),a.sum(axis=0)) #分别对矩阵和列求和
  4. print(a.mean(),a.min(1),a.std(1)) #分别对矩阵和行求均值、最小值及标准差
  5. print(np.median(a)) #求中位数
复制代码

结果:
18 [5 7 6] [5 7 6]
3.0 [1 3] [1.24721913 0.47140452]
3.5
(4)索引、切片、遍历
  1. import numpy as np
  2. a=np.arange(0,11,1)**2
  3. print(a)
  4. #数组的索引切片原理和 List 等类似:索引从 0 开始,-1 代表最后一个索引;左闭右开原则
  5. print(a[2],a[-1]) #取某个值
  6. print(a[-3:-1]) #切片取值
  7. #遍历输出
  8. for i in a:
  9.     print(i)
复制代码

结果:
[  0   1   4   9  16  25  36  49  64  81 100]
4 100
[64 81]
0
1
4
9
16
25
36
49
64
81
100
(5)形状
  1. import numpy as np
  2. a=100*np.random.random((3,2)) #随机产生大小在 0-100 之间的 3 行 2 列的数
  3. print(a)
  4. b=np.floor(a) #截取整数部分
  5. print(b)
  6. c = b.ravel() #一维化操作(一行)
  7. print(c)
  8. b.shape=(2,3) #改变形状
  9. print(b)
  10. d = b.transpose() #转置
  11. print(d)
复制代码

结果:
[[75.99782619 74.06244548]
[70.41664169 56.32881617]
[67.44402839 91.04109504]]
[[75. 74.]
[70. 56.]
[67. 91.]]
[75. 74. 70. 56. 67. 91.]
[[75. 74. 70.]
[56. 67. 91.]]
[[75. 56.]
[74. 67.]
[70. 91.]]
(6)删除
  1. import numpy as np
  2. #一维数组中删除元素
  3. a=np.arange(1,5,1)
  4. print(a)
  5. a=np.delete(a,0) #删除 a 中第一个元素
  6. print(a)
  7. #二维数组中删除元素
  8. #注:在删除里 axis=0
  9. b=np.arange(0,10,1).reshape(2,-1)
  10. print(b)
  11. c=np.delete(b,1,0) #删除 b 中第 2 行元素
  12. print(c)
  13. d=np.delete(c,2,None) #删除 c 中值为 2 的元素
  14. print(d)
复制代码

结果:
[1 2 3 4]
[2 3 4]
[[0 1 2 3 4]
[5 6 7 8 9]]
[[0 1 2 3 4]]
[0 1 3 4]


头秃
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|TY_Board论坛

GMT+8, 2024-5-20 06:30 , Processed in 0.059461 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表