学习笔记3 | 高维数据处理——Xarray

这篇具有很好参考价值的文章主要介绍了学习笔记3 | 高维数据处理——Xarray。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、数据结构

1.DataArray

(1)DataArray的创建

(2)DataArray的属性及常用方法

2.DataSet

(1)DataSet的创建

(2)DataSet的属性和常用方法

二、数据的读取

1.读取nc文件

2.读取grib文件

3.读取多个文件并 合并

三、数据的索引

1.通过位置索引

2.通过名字索引

四、数据的坐标系统

1.修改坐标

2.增加/删除坐标

五、数据统计与计算

1.基础运算

2.降维

3.分组与聚合

4.滑窗

5.插值

六、高维数据可视化

1.时间序列可视化

2.空间数据可视化

3.多子图

七、数据的掩膜

1.数值掩膜

2.空间位置掩膜


一、数据结构

1.DataArray

(1)DataArray的创建

import xarray as xr
import numpy as np
import pandas as pd

data = np.random.randn(4,3,2)  #随机生成三维数组
xr.DataArray(data) #简单的dataarray

times = pd.date_range('2000-01-01',periods=4)
lat = [0,1,2]
lon = [10,20]
da = xr.DataArray(
    data,
    coords={
        'time'=times,
        'lat'=lat,
        'lon'=lon
    },
    dims=['time','lat','lon']
)

(2)DataArray的属性及常用方法

da.dims #获取维度
da.coords #获取坐标
da.values #获取数值
type(da.values)
da.attrs #获取属性
da.attrs['name']='precitation' #设置属性
da.attrs['units']='mm'
da.rename('rain')

2.DataSet

可以理解为多个DataArray的集合

(1)DataSet的创建

#1.直接创建
temp = 15+8*np.random.randn(4,3,2)
precip = 10*np.random.randn(4,3,2)
xr.Dataset(
    {
        'temperature'=(['time','lat','lon'],temp)
        'precipitation'=(['time','lat','lon'],precip)
    },
    coords={
        'lon'=lon
        'lat'=lat
        'time'=times
    }
)

#2.使用DataArray创建
xr.Dataset({'precip':da})
xr.Dataset({
    'precip':da,
    'temp':da+10
})

(2)DataSet的属性和常用方法

ds.data_vars #显示有哪些变量
'temp' in ds #判断变量是否在Dataset中
ds.coords
ds._coord_names  #获取坐标名
ds._dims #获取维度

ds.drop_vars('temp') #剔除变量
ds.drop_dims('time') #剔除维度

二、数据的读取

  1. nc数据:再分析数据、气候系统模拟
  2. grib数据:数值预报中用的较多

1.读取nc文件

#xarray.open_dataset()  engine=netcdf4/cfgrib
import xarray as xr
ds = xr.open_dataset('filename') #engine默认netcdf4
ds.longitude
ds.longitude.values
ds.time
type(ds.time.values)
ds['latitude']
ds['t2m']
ds['t2m'].values

#xarray.open_dataarray #只能打开含有一个变量
da = xr.open_dataset('filename',drop_variables=['u10','v10','swh'])
da = xr.open_dataarray('filename',drop_variables=['u10','v10','swh'])
da = xr.open_dataarray('filename')

2.读取grib文件

xr.open_dataset('fd.grib2',engine='cfgrib') #打开后发现缺少t2m类似其他坐标系统里的变量1
xr.open_dataset('fd.grib2',engine='cfgrib',
    backend_kwargs={
        'filter_by_keys':{
            'typeOfLevel':'heightAboveGround',
            'level':2
        }})
xr.open_dataset('fd.grib2',engine='cfgrib',
    backend_kwargs={
        'filter_by_keys':{
            'typeOfLevel':'surface',
            'level':0
        }})

3.读取多个文件并 合并

# xarray.open_mfdataset(paths,engine=' ')
xr.open_dataset('filename')
xr.open_mfdataset('../*.nc') #mfdataset也可以读取一个文件

三、数据的索引

1.通过位置索引

:在指定维度位置上输入相应的数值来索引,只能在dataArray中使用

#1.通过数字查找
import xarray as xr
xr.open_dataset('filename')
t = ds['t2m']
t.values
t.values.shape
t[0,0,0] #得到的是dataArray
t[:,1,1]

#2.标签查找
t.loc[:,89.75,70.25]
t.loc[:,89.75:80,70.25:71]  #维度从大到小排列,经度从小到大排列

2.通过名字索引

:索引时输入相关的维度名称和相应的数值

#1.数字查找
ds.isel(longitude=1,time=0) #1是位置,没有查找的坐标全部都取

#2.标签查找
ds.sel(longitude=70.25,latitude=50,time='2020-01-01') #70.25是值

#3.时空的切片索引
#空间索引
ds.sel(latitude=slice(80,50),longitude=slice(80,155))
ds.sortby('latitude') #按照latitude排序
ds.sel(latitude=slice(50,80),longitude=slice(80,155))
#时间索引
ds.sel(time=slice('2020-02-03','2020-05')
ds.sel(time='2020-01-01 06')
ds.sel(time=(ds.time.dt.day==15)) #指定15号
ds.sel(time=(ds.time.dt.month.isin([1,3,5]))) #提取1,3,5月的数据

四、数据的坐标系统

1.修改坐标

import xarray as xr
ds = xr.open_dataset('filename')

#1.修改坐标名字
ds.rename({
    'longitude':'x',
    'latitude':'y'})

#2.修改坐标数值
ds.assign_coords(longitude=ds['longitude']+180)

#3.时间坐标拆分
yearv= = ds.time.dt.year
monthv = ds.time.dt.month
dayv = ds.time.dt.day
hourv = ds.time.dt.hour
ds_time = ds.assign_coords(year=yearv,month=monthv,day=dayv,hour=hourv) #只定义进去了但没有和变量关联起来
ds1 = ds_time.set_index(time_new=('year','month','day','hour')) #增加坐标到dimension里
ds1.sel(time_new=(2020,1,15,[0,12]))
ds1.drop_dims('time').unstack('time_new') #但time是和变量关联的,删除之后变量也没了,所以要修改
#修改上面三步
ds1 = ds_time.set_index(time=('year','month','day','hour'))
ds1.sel(time=(2020,1,15,[0,12]))
time = ds1.unstack('time_new')
time.sel(day=15,hour=18)

2.增加/删除坐标

#1.增加坐标
t = ds['t2m'].expand_dims(height=1) #但还没有关联到变量里,还没有赋值
t.assign_coords(height=[2])

#2.删除坐标
t.squeeze('height') #只能把维度是1的坐标压缩(应该意思是只有一个值的维度吧)

五、数据统计与计算

1.基础运算

import xarray as xr
#1.四则运算
ds = xr.open_dataset('....nc')
t = ds['t2m']
t.values
t-273.15
u = ds['u10']
v = ds['v10']
u ** 2 + v ** 2 #风速的平方

#2.常用函数
t.max()
t.min()
t.mean()
t.std()

import numpy as np
np.max(t) #和上面结果一样
np.sqrt(u**2 +v**2)
abs(u)

2.降维

遇到缺测值可以自动忽略

#1.时间降维
t.mean()
t.mean(dim='time') #年平均气温
t-t.mean(dim='time') #距平气温
#2.空间降维
t.mean(dim=['latitude','longitude'])

3.分组与聚合

时间分辨率有:year、month、day、hour、minute、second、microsecond、season、dayofyear、dayofweek、days_in_month

#xarray.DataArray.groupby(group,squeeze= ,restore_coord_dims= )
t.groupby('time.month')
t.groupby('time.season')

tmonth = t.groupby('time.month')
tmonth.groups
for i,data in t_month:
    print(i,data['time'])
tmonth.mean() #时间维度变成month

4.滑窗

:是在简单平均数基础上,通过顺序逐期增减新旧数据求算滑动平均,借以消除偶然变动因素,找出事物发展趋势,并进行预测的方法。

#xarray.DataArray.rolling(dim=None,center=False,min_periods=None)
t_time = t.mean(['longitude','latitude'])
r = t_time.rolling({'time':5})
r.mean() #前五个是nan

r = t_time.rolling(time=5,center=True)
r.mean() #前2个和最后2个是nan
r.max() #其他函数也可以用
#空间平滑
t_region = t.mean('time')
r = t_region.rolling(longitude=5,latitude=5,center=True)
r.mean()

5.插值

#Xarray.DataArray.interp(coords= ,method= ,...)
#算法有:多维:linear、nearest;一维:linear、nearest、zero、slinear、qadratic、cubic

#1.一维插值
t_oneday = t.sel(time='2020-01-01') #有四个时间 0,6,12,18
t_oneday.time
import pandas as pd
new_time = pd.data_range(t_oneday.time.values[0],t_oneday.time.values[-1],freq='3H')
t_oneday.interp(time=new_time) #插值成功

#2.多维插值
t_region = t_t.sel(longitude=slice(100,101),latitude=slice(41,40)) #slice左右都是闭的
import numpy as np
nlat = np.linspace(41,40,11)
nlon = np.linspace(100,101,11)
t_region.interp(longitude=nlon,latitude=nlat)

六、高维数据可视化

画图对象:dataarray,使用matplotlib库

一维数据:line();二维数据:pcolormesh();其他:hist()

1.时间序列可视化

import xarray as xr
da = xr.open_dataset('....nc')
t = da['t2m']-273.15
t_point = t.isel(latitude=10,longitude=10) #10是位置
t_point.plot()

t_month = t_point.groupby('time.month').mean()
t_month.plot()

#多个点的时间序列
tp = t.isel(latitude=[10,100,200],longitude=10)
tp.plot() #结果是堆叠的hist
tp.plot(hue='latitude') #得到不同latitude的折线图

2.空间数据可视化

t_season = t.sel(longtitude=slice(90,120),latitude=slice(50,20)).groupby('time.season').mean()
t_season.iseal(season = 0).plot()

3.多子图

t_season = t.sel(longtitude=slice(90,120),latitude=slice(50,20)).groupby('time.season').mean()
g = t_season.plot(col='season',col_wrap=2) #col_wrap是两行的意思
g.axes

tp = t.isel(latitude=[10,100,200],longitude=[10,100,200])
tp.plot(row='latitude',col='longtitude')

七、数据的掩膜

把不要的数据隐藏起来的最简便的方法就是设为nan,计算和可视化过程都不参与

  1. 数值掩膜
  2. 空间位置掩膜

1.数值掩膜

#xarray.where(cond,x,y,keep_attrs=None)
import xarray as xr
import numpy as np
ds = xr.open_dataset('...nc')
u = ds['u10']
v = ds['v10']
ws = np.sqrt(u**2+v**2)
ws_region = ws.mean('time')
ws_region.plot()
xr.where(ws_region >5,ws_region,np.nan).plot()

2.空间位置掩膜

1.shp文件 ;2.salem掩膜工具文章来源地址https://www.toymoban.com/news/detail-638126.html

#1.陆地掩膜
import geopandas as gpd
import salem 
land_shp = gpd.read_file('filename')
land = ws_region.salem.roi(shape = land_shp) #region of interest
land.plot()

#2.海洋掩膜
ocean_shp = gpd.read_file('filename')
ocean = ws_region.salem.roi(shape = ocean_shp)
ocean.plot()

#3.行政区划掩膜
china_shp = gpd.read_file('filename')
china = ws_region.salem.roi(shape = china_shp)
select = china_shp[china_shp['省'].isin(['广东省','河南省'])]

到了这里,关于学习笔记3 | 高维数据处理——Xarray的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spark大数据处理学习笔记(3.2.2)掌握RDD算子

    衔接上文:http://t.csdn.cn/Z0Cfj 功能: reduce()算子按照传入的函数进行归约计算 案例: 计算1 + 2 + 3 + …+100的值 计算1 × 2 × 3 × 4 × 5 × 6 的值(阶乘 - 累乘) 计算1 2 + 2 2 + 3 2 + 4 2 + 5**2的值(先映射,后归约) 功能: collect()算子向Driver以数组形式返回数据集的所有元素。通常对

    2024年02月08日
    浏览(48)
  • Spark大数据处理学习笔记(2.2)搭建Spark Standalone集群

    一、在master虚拟机上安装配置Spark 1.1 将spark安装包上传到master虚拟机 下载Spark:pyw2 进入/opt目录,查看上传的spark安装包 1.2 将spark安装包解压到指定目录 执行命令: tar -zxvf spark-3.3.2-bin-hadoop3.tgz 修改文件名:mv spark-3.3.2-bin-hadoop3 spark-3.3.2 1.3 配置spark环境变量 执行命令:vim

    2024年02月09日
    浏览(52)
  • Spark大数据处理学习笔记(2.4)IDEA开发词频统计项目

    该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/0qE1L】 从Scala官网下载Scala2.12.15 - https://www.scala-lang.org/download/2.12.15.html 安装在默认位置 安装完毕 在命令行窗口查看Scala版本(必须要配置环境变量) 启动HDFS服务 启动Spark集群 在master虚拟机上创建单词文件

    2024年02月08日
    浏览(57)
  • Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API

    Java 是一种由 Sun Microsystems 于 1995 年首次发布的编程语言和计算平台。Java 是一种通用的、基于类的、面向对象的编程语言,旨在减少实现依赖性。它是一个应用程序开发的计算平台。Java 快速、安全、可靠,因此在笔记本电脑、数据中心、游戏机、科学超级计算机、手机等领

    2024年03月24日
    浏览(91)
  • matlab数据的获取、预处理、统计、可视化、降维 | 《matlab数学建模方法与实践(第三版)》学习笔记

    一、数据的获取 1.1 从Excel中获取 使用readtable() 使用xlsread()——xlswrite() 1.2  从TXT中获取 使用load() 使用textread() 使用fopen() fread() fclose()  使用fprintf()写入信息到txt  1.3 从图片中获取 使用imread  1.4 从视频获取  使用视觉工具箱中的VideoFileReader  二、数据的预处理 2.1 缺失值处

    2024年01月19日
    浏览(67)
  • Python:PDF文件处理(数据处理)

    工作中有对PDF文件进行数据抽取,现在总结归纳一下相应的方法,本文包括一下内容: PDF文件分割、拼接; PDF文件抽取图片,简单的图片识别; PDF文件抽取表格; PDF文件抽取文本; PDF文件转docx文件; docx文件数据抽取; 目的:尽可能的将pdf中的数据,抽取出来,尤其是文

    2024年02月09日
    浏览(81)
  • transdata笔记:手机数据处理

    staydata 停留数据(每一行是一条数据) col    列名,顺序为[‘starttime’,’endtime’] start_hour 白天的开始时间 end_hour 白天的结束时间 duration_night    一个panda的Series,表示夜间持续时间 duration_day  一个panda的Series,表示白天持续时间 每一行表示在一个staypoint的开始-结束时间

    2024年01月25日
    浏览(31)
  • 【Python数据处理】-Pandas笔记

    Pandas是一个强大的Python数据处理库,它提供了高效的数据结构和数据分析工具,使数据处理变得简单而快速。本篇笔记将介绍Pandas中最常用的数据结构——Series和DataFrame,以及数据处理的各种操作和技巧。 (一)创建Series Series是Pandas中的一维数组,类似于带有标签的NumPy数组

    2024年02月12日
    浏览(45)
  • 数据集笔记:Pems 自行下载数据+python处理

    以下载District 4的各station每5分钟的车速为例 点击红色的 选择需要的station和区域,点击search,就是对应的数据,点击数据即可下载 (这个是station每5分钟的速度数据) Timestamp 间隔开始的日期和时间。例如,08:00:00的时间表明聚合包含在08:00:00到08:04:59之间收集的测量数据。

    2024年04月11日
    浏览(53)
  • 【医学影像数据处理】 XML 文件格式处理汇总

    xml(Extensible Markup Language,简称:XML) 可扩展标记语言,是一种 netconf 配置文件的格式。是一种固有的分层数据格式,最自然的表示方式是解析成树状。 但是, xml 这样的标签数据,是 面向“机器”识别的,是不利于“人类”识别的 ,所以看起来会比较的麻烦。 2003年5月成

    2024年02月08日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包