Python | 计算中国5°×5°方格 年总降水

2023-11-05 05:20

本文主要是介绍Python | 计算中国5°×5°方格 年总降水,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0.写在前面

继续学习站点数据处理ing,这是上周第一个任务,一共三个,写三篇(或者四篇)来记录。

任务一:将中国和部分周围区域划分为5°×5°的格子,计算每个格子内的年降水。

难点:依次读取文件夹中数据

解决办法:遍历每天的站点,找到他属于哪个方格,先计算每天每方格内所有站点的平均,再把每天的降水二维数组加起来(365天)

所用数据:2014年365天SURF_CHN_MUL_DAY_2014****格式数据,每个文件是每天所有站点的气象要素记录

1.代码解析

1.1 主函数

path = r"D:2014-2020\2014"
files= os.listdir(path)k=1  #k可以用来控制读取文件数量
yearsum=np.zeros([5,14],dtype=float,order='C') #yearsum用来记录总降水
for filename in files:  #依次读取文件夹中的文件df = pd.read_table(os.path.join(path,filename),sep='\t',header=None)day=dave(df)   #dave函数用来求每天的平均降水(对站点降水求平均)yearsum=yearsum+dayk=k+1draw(yearsum) #draw函数负责可视化年降水

1.2 dave函数

def dave(df):lat = df[64]del lat[0]  #lat[0]是表头,要删掉,自己摸索的时候可以一步一步输出试试lat=lat.astype(float) #改变数据格式lon = df[66]del lon[0]lon=lon.astype(float)pre=df[72]del pre[0]pre=pre.astype(float) #999999是缺测,不算降水,0算daypre=np.zeros([5,14],dtype=float,order='C') #每个小方格站点总降水daysta=np.zeros([5,14],dtype=float,order='C') #站点数,缺测不算for m in range(1,(len(lat)+1)): #遍历一天内所有站点if lat[m]<55 and lat[m]>=30 and lon[m]>=70 and lon[m]<140:a=lat[m]i=4-int(((a-30)//5))b=lon[m]j=int(((b-70)//5))if pre[m]<500: #如果没有缺测daysta[i][j]=daysta[i][j]+1daypre[i][j]=daypre[i][j]+pre[m]dayave=np.zeros([5,14],dtype=float,order='C') #每天平均降水for i in range(0,5):for j in range(0,14):if daysta[i][j]!=0:dayave[i][j]=daypre[i][j]/daysta[i][j]return dayave 

1.3 draw函数

def draw(ave):  #还是之前的老一套,有疑问可评论fig = plt.figure(1, figsize=[16, 9])proj = ccrs.PlateCarree()ax = plt.subplot(1, 1, 1, projection=proj)extent = [70, 140, 30, 55]ax.set(xlim=(70,140),ylim=(30,55))ds = xr.open_dataset(r"D:\地形图\ETOPO2v2c_f4.nc")lon = np.linspace(min(ds['x'].data), max(ds['x'].data), len(ds['x'].data))  # 经度lat = np.linspace(min(ds['y'].data), max(ds['y'].data), len(ds['y'].data))  # 纬度dem = ds['z'].data# 构建经纬网格lon, lat = np.meshgrid(lon, lat)ax.set(xlim=(70,140),ylim=(30,55))
# 创建底图,设置地图投影为World Plate Carrée,分辨率为高分辨率levels = [-8000, -6000, -4000, -2000, -1000, -200, -50, 0, 50,200, 500, 1000, 1500, 2000, 3000, 4000, 5000, 6000, 7000, 8000]# 创建分级color = ['#084594', '#2171b5', '#4292c6', '#6baed6', '#9ecae1', '#c6dbef', '#deebf7', '#006837','#31a354', '#78c679', '#addd8e', '#d9f0a3', '#f7fcb9', '#c9bc87', '#a69165', '#856b49','#664830', '#ad9591', '#d7ccca']  # 设置色带,19个颜色cf = ax.contourf(lon, lat, dem, levels=levels, colors=color, extend='both',zorder=1)china = shpreader.Reader(r"D:\bou2_4l\bou2_4l.dbf").geometries()plt.title('2014年降水总量', fontsize=20,pad=20)ax.add_geometries(china, ccrs.PlateCarree(),facecolor='none', edgecolor='black', zorder=2) ax.add_geometries(Reader(r"D:\1~5级水系矢量图\river\1级河流.shp").geometries(), ccrs.PlateCarree(), facecolor='none', edgecolor='RoyalBlue', linewidth=0.4)             c=np.ones([5,14],dtype=float,order='C')alpha=np.where(ave!=0,c*0.7,0)  #这里是把没有降水的地方透明度设为0了,作图就不显示plt.imshow(ave,cmap='rainbow',extent=(70,140,30,55),alpha=alpha,zorder=3)cb=plt.colorbar(shrink=0.5)cb.set_label('单位:mm',fontsize=12)ax.set_xticks(np.arange(extent[0], extent[1]+1, 10), crs=proj)ax.set_yticks(np.arange(extent[-2], extent[-1]+1, 5), crs=proj)ax.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label=False))ax.yaxis.set_major_formatter(LatitudeFormatter())plt.tick_params(labelsize=12)plt.show()

2. 完整代码

from importlib.resources import path
import os
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from cartopy.io.shapereader import Reader
from cartopy.io import shapereader as shpreader
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
import cartopy.crs as ccrs
import time
import xarray as xrtime_start = time.time()
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsedef dave(df):lat = df[64]del lat[0]lat=lat.astype(float)lon = df[66]del lon[0]lon=lon.astype(float)pre=df[72]del pre[0]pre=pre.astype(float)daypre=np.zeros([5,14],dtype=float,order='C')daysta=np.zeros([5,14],dtype=float,order='C') for m in range(1,(len(lat)+1)): if lat[m]<55 and lat[m]>=30 and lon[m]>=70 and lon[m]<140:a=lat[m]i=4-int(((a-30)//5))b=lon[m]j=int(((b-70)//5))if pre[m]<500:daysta[i][j]=daysta[i][j]+1daypre[i][j]=daypre[i][j]+pre[m]dayave=np.zeros([5,14],dtype=float,order='C') for i in range(0,5):for j in range(0,14):if daysta[i][j]!=0:dayave[i][j]=daypre[i][j]/daysta[i][j]return dayave def draw(ave):fig = plt.figure(1, figsize=[16, 9])proj = ccrs.PlateCarree()ax = plt.subplot(1, 1, 1, projection=proj)extent = [70, 140, 30, 55]ax.set(xlim=(70,140),ylim=(30,55))ds = xr.open_dataset( r"D:\地形图\ETOPO2v2c_f4.nc")lon = np.linspace(min(ds['x'].data), max(ds['x'].data), len(ds['x'].data))  # 经度lat = np.linspace(min(ds['y'].data), max(ds['y'].data), len(ds['y'].data))  # 纬度dem = ds['z'].datalon, lat = np.meshgrid(lon, lat)ax.set(xlim=(70,140),ylim=(30,55))levels = [-8000, -6000, -4000, -2000, -1000, -200, -50, 0, 50,200, 500, 1000, 1500, 2000, 3000, 4000, 5000, 6000, 7000, 8000]color = ['#084594', '#2171b5', '#4292c6', '#6baed6', '#9ecae1', '#c6dbef', '#deebf7', '#006837','#31a354', '#78c679', '#addd8e', '#d9f0a3', '#f7fcb9', '#c9bc87', '#a69165', '#856b49','#664830', '#ad9591', '#d7ccca']  # 设置色带,19个颜色cf = ax.contourf(lon, lat, dem, levels=levels, colors=color, extend='both',zorder=1)china = shpreader.Reader(r"D:\bou2_4l\bou2_4l.dbf").geometries()plt.title('2014年降水总量', fontsize=20,pad=20)ax.add_geometries(china, ccrs.PlateCarree(),facecolor='none', edgecolor='black', zorder=2)  ax.add_geometries(Reader(r"D:\1~5级水系矢量图\river\1级河流.shp").geometries(), ccrs.PlateCarree(), facecolor='none', edgecolor='RoyalBlue', linewidth=0.4)             c=np.ones([5,14],dtype=float,order='C')alpha=np.where(ave!=0,c*0.7,0)plt.imshow(ave,cmap='rainbow',extent=(70,140,30,55),alpha=alpha,zorder=3)cb=plt.colorbar(shrink=0.5)cb.set_label('单位:mm',fontsize=12)ax.set_xticks(np.arange(extent[0], extent[1]+1, 10), crs=proj)ax.set_yticks(np.arange(extent[-2], extent[-1]+1, 5), crs=proj)ax.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label=False))ax.yaxis.set_major_formatter(LatitudeFormatter())plt.tick_params(labelsize=12)plt.show()path = r"D:\2014-2020\2014"
files= os.listdir(path)
k=1
yearsum=np.zeros([5,14],dtype=float,order='C')
for filename in files:df = pd.read_table(os.path.join(path,filename),sep='\t',header=None)day=dave(df)yearsum=yearsum+dayk=k+1draw(yearsum)time_end = time.time()  # 记录结束时间
time_sum = time_end - time_start  # 计算的时间差为程序的执行时间,单位为秒/s
print('运行时间:',time_sum)

成图:

 

这篇关于Python | 计算中国5°×5°方格 年总降水的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/347670

相关文章

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Python Websockets库的使用指南

《PythonWebsockets库的使用指南》pythonwebsockets库是一个用于创建WebSocket服务器和客户端的Python库,它提供了一种简单的方式来实现实时通信,支持异步和同步... 目录一、WebSocket 简介二、python 的 websockets 库安装三、完整代码示例1.

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很