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

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

[复制链接]

2

主题

36

回帖

254

积分

热带低压

积分
254
发表于 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

回帖

254

积分

热带低压

积分
254
 楼主| 发表于 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不是内部或外部命令”说明安装失败,可百度或在本楼下回复帮助解决。

本帖子中包含更多资源

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

×

点评

膜拜大佬  发表于 2024-4-7 22:24
开始膜拜,今天修4个bug修了一个小时  发表于 2024-4-6 21:28
智齿bala高聚教程  发表于 2024-4-6 20:38
头秃

2

主题

36

回帖

254

积分

热带低压

积分
254
 楼主| 发表于 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分)

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

本帖子中包含更多资源

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

×

点评

pycharm在哪下载呢  发表于 2024-4-21 20:00
头秃

2

主题

36

回帖

254

积分

热带低压

积分
254
 楼主| 发表于 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

回帖

254

积分

热带低压

积分
254
 楼主| 发表于 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

回帖

165

积分

热带低压

积分
165
发表于 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?

点评

HCl
Satpy package contains readers for both HRPT and GAC format iirc. You can try it.  发表于 2024-4-7 06:22
欢迎越南友人!Welcome our friend from Vietnam!  发表于 2024-4-6 21:30

评分

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

查看全部评分

2

主题

36

回帖

254

积分

热带低压

积分
254
 楼主| 发表于 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等
头秃

0

主题

3

回帖

82

积分

热带扰动-TCFA

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

2

主题

36

回帖

254

积分

热带低压

积分
254
 楼主| 发表于 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

回帖

254

积分

热带低压

积分
254
 楼主| 发表于 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-21 05:43 , Processed in 0.052772 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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