我正在使用xarray. 组合多个 netcdf 文件xarray.open_mfdataset。但是我在运行命令时收到错误,下面是命令和错误。
nc_all = xarray.open_mfdataset(files,combine = 'nested', concat_dim="time")
files = glob.glob("/filepath/*")
Run Code Online (Sandbox Code Playgroud)
我收到以下错误 -
Traceback (most recent call last):
File "/home/lsrathore/GLEAM/GLEAM_HPC.py", line 85, in <module>
nc_1980_90 = xarray.open_mfdataset(files[1:11],combine = 'nested', concat_dim="time")
File "/home/lsrathore/.local/lib/python3.9/site-packages/xarray/backends/api.py", line 1038, in open_mfdataset
datasets = [open_(p, **open_kwargs) for p in paths]
File "/home/lsrathore/.local/lib/python3.9/site-packages/xarray/backends/api.py", line 1038, in <listcomp>
datasets = [open_(p, **open_kwargs) for p in paths]
File "/home/lsrathore/.local/lib/python3.9/site-packages/xarray/backends/api.py", line 572, in open_dataset
ds = _dataset_from_backend_dataset(
File "/home/lsrathore/.local/lib/python3.9/site-packages/xarray/backends/api.py", line 367, in _dataset_from_backend_dataset
ds …Run Code Online (Sandbox Code Playgroud) 我有一系列CSV格式的月度网格化数据集.我想阅读它们,添加几个维度,然后写入netcdf.我以前在使用xarray(xray)方面有很棒的经验,所以我想在这个任务中使用它.
我可以很容易地将它们变成2D DataArray,例如:
data = np.ones((360,720))
lats = np.arange(-89.75, 90, 0.5) * -1
lngs = np.arange(-179.75, 180, 0.5)
coords = {'lat': lats, 'lng':lngs}
da = xr.DataArray(data, coords=coords)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试添加另一个维度时,它将传达有关时间的信息(所有数据来自同一年/月),事情开始变得糟糕.
我试过两种破解方法:
1)将我的输入数据扩展为mxnx 1,类似于:
data = np.ones((360,720))
lats = np.arange(-89.75, 90, 0.5) * -1
lngs = np.arange(-179.75, 180, 0.5)
coords = {'lat': lats, 'lng':lngs}
data = data[:,:,np.newaxis]
Run Code Online (Sandbox Code Playgroud)
然后我按照上面的相同步骤,更新coords以包含第三个维度.
lats = np.arange(-89.75, 90, 0.5) * -1
lngs = np.arange(-179.75, 180, 0.5)
coords = {'lat': lats, 'lng':lngs}
coords['time'] = pd.datetime(year, month, day))
da = xr.DataArray(data, …Run Code Online (Sandbox Code Playgroud) 所以我有3个netcdf4文件(每个约90 MB),我想使用包xarray连接.每个文件有一个变量(dis),以0.5度分辨率(lat,lon)表示365天(时间).我的目标是连接三个文件,使得我们的时间序列为1095天(3年).
每个文件(2007年,2008年,2009年)都有:1个变量:dis 3坐标:time,lat,lon ......就这样
<xarray.Dataset>
Dimensions: (lat: 360, lon: 720, time: 365)
Coordinates:
* lon (lon) float32 -179.75 -179.25 -178.75 -178.25 -177.75 -177.25 ...
* lat (lat) float32 89.75 89.25 88.75 88.25 87.75 87.25 86.75 86.25 ...
* time (time) datetime64[ns] 2007-01-01 2007-01-02 2007-01-03 ...
Data variables:
dis (time, lat, lon) float64 nan nan nan nan nan nan nan nan nan ...
Run Code Online (Sandbox Code Playgroud)
我得到它们导入并使用concat模块连接,我认为成功.在这种情况下,模块从filestrF中读出3个netcdf文件名
flist1 = [1,2,3]
ds_new = xr.concat([xr.open_dataset(filestrF[0,1,1,f]) for f in flist1],dim='time')
Run Code Online (Sandbox Code Playgroud)
现在显示新数据集的新细节:
Dimensions: (lat: 360, lon: 720, …Run Code Online (Sandbox Code Playgroud) 非常简单的问题,但我无法在线找到答案。我有一个Dataset,我只想为其添加一个名称DataArray。有点像dataset.add({"new_array": new_data_array})。我知道merge和update和concatenate,但我的理解是,merge对于合并两个或更多的DatasetS和concatenate用于连接两个或更多的DataArrays到形成另一个DataArray,我还没有完全充分理解update呢。我已经尝试过,dataset.update({"new_array": new_data_array})但是出现以下错误。
InvalidIndexError: Reindexing only valid with uniquely valued Index objects
Run Code Online (Sandbox Code Playgroud)
我也尝试过dataset["new_array"] = new_data_array,但遇到相同的错误。
现在,我发现问题是我的某些坐标具有重复的值,而我不知道这些值。坐标用作索引,因此在尝试合并共享坐标时,Xarray会感到困惑(可以理解)。下面是一个有效的示例。
names = ["joaquin", "manolo", "xavier"]
n = xarray.DataArray([23, 98, 23], coords={"name": names})
print(n)
print("======")
m = numpy.random.randint(0, 256, (3, 4, 4)).astype(numpy.uint8)
mm = xarray.DataArray(m, dims=["name", "row", "column"], coords=[names, range(4), range(4)])
print(mm)
print("======")
n_dataset = n.rename("number").to_dataset() …Run Code Online (Sandbox Code Playgroud) 我发现可视化创建a的最简单方法N-dimensional DataArray是制作a np.ndarray然后按我创建的坐标填充值.当我试图实际做到这一点时,我无法弄清楚如何更新xr.DataArray.
如何xr.DataArray使用我创建的标签更新我已初始化的内容?我的实际数据是一个更复杂的数据集,但这总结了我正在尝试做的事情.我可以使用,.loc但有时我ndarrays会变得庞大而复杂,我不知道昏暗的顺序.
# Construct DataArray
DA = xr.DataArray(np.ndarray((3,3,5)), dims=["axis_A","axis_B","axis_C"], coords={"axis_A":["A_%d"%_ for _ in range(3)],
"axis_B":["B_%d"%_ for _ in range(3)],
"axis_C":["C_%d"%_ for _ in range(5)]})
# <xarray.DataArray (axis_A: 3, axis_B: 3, axis_C: 5)>
# array([[[ 0., 0., 0., 0., 0.],
# [ 0., 0., 0., 0., 0.],
# [ 0., 0., 0., 0., 0.]],
# [[ 0., 0., 0., 0., 0.],
# [ 0., 0., 0., 0., …Run Code Online (Sandbox Code Playgroud) 有什么方法可以netCDF使用向文件添加全局属性xarray吗?当我做类似的事情时hndl_nc['global_attribute'] = 25,它只是添加了一个新变量。
我有一个带foll的netCDF文件。结构体:
<xarray.Dataset>
Dimensions: (latitude: 94, longitude: 192, time: 366)
Coordinates:
* longitude (longitude) float32 -180.0 -178.125 -176.25 -174.375 -172.5 ...
* latitude (latitude) float32 88.5419 86.6532 84.7532 82.8508 80.9474 ...
* time (time) datetime64[ns] 2016-01-01 2016-01-02 2016-01-03 ...
Data variables:
m2t (time, latitude, longitude) float64 246.5 246.4 246.4 246.4
pre (time, latitude, longitude) float64 9.988e-08 9.988e-08 ...
Attributes:
Conventions: CF-1.0
Run Code Online (Sandbox Code Playgroud)
如何为特定经度和纬度(例如86.45,-156.25)和时间(例如2016-01-10)提取网格单元的值?确切的纬度/经度值可能不在坐标中,在这种情况下,我们需要最接近的纬度/经度值
我可以像这样提取特定经度的值:
_hndl_nc.sel(longitude=(_hndl_nc.longitude == -20))
Run Code Online (Sandbox Code Playgroud)
但是,由于经度坐标中不存在-20,因此此方法无效。
我有一个栅格时间序列存储在多个GeoTIFF文件(*.tif)中,我想将其转换为单个NetCDF文件。数据是uint16。
我可能会使用以下gdal_translate命令将每个图像转换为netcdf:
gdal_translate -of netcdf -co FORMAT=NC4 20150520_0164.tif foo.nc
Run Code Online (Sandbox Code Playgroud)
然后使用一些脚本NCO从文件名中提取日期然后进行连接,但是我想知道是否可以在Python中使用xarray它更有效地进行此操作,并且它是新的rasterio后端。
我可以轻松读取文件:
import glob
import xarray as xr
f = glob.glob('*.tif')
da = xr.open_rasterio(f[0])
da
Run Code Online (Sandbox Code Playgroud)
哪个返回
<xarray.DataArray (band: 1, y: 5490, x: 5490)>
[30140100 values with dtype=uint16]
Coordinates:
* band (band) int64 1
* y (y) float64 5e+05 5e+05 5e+05 5e+05 5e+05 4.999e+05 4.999e+05 ...
* x (x) float64 8e+05 8e+05 8e+05 8e+05 8.001e+05 8.001e+05 …Run Code Online (Sandbox Code Playgroud) 我正在使用以下软件包:
import pandas as pd
import numpy as np
import xarray as xr
import geopandas as gpd
Run Code Online (Sandbox Code Playgroud)
我有以下存储数据的对象:
print(precip_da)
Out[]:
<xarray.DataArray 'precip' (time: 13665, latitude: 200, longitude: 220)>
[601260000 values with dtype=float32]
Coordinates:
* longitude (longitude) float32 35.024994 35.074997 35.125 35.175003 ...
* latitude (latitude) float32 5.0249977 5.074997 5.125 5.174999 ...
* time (time) datetime64[ns] 1981-01-01 1981-01-02 1981-01-03 ...
Attributes:
standard_name: convective precipitation rate
long_name: Climate Hazards group InfraRed Precipitation with St...
units: mm/day
time_step: day
geostatial_lat_min: -50.0
geostatial_lat_max: 50.0 …Run Code Online (Sandbox Code Playgroud) 我有一个数据框,其中的列包括纬度,经度,时间和数据值。我想重塑形状并将其转换为xarray数据数组,以使维度为时间x纬度/长对,但不确定执行此操作的最有效方法。
具体来说,数据框的结构如下:
Index Latitude Longitude Time Data
0 1 2 1 1
1 2 4 1 2
2 1 2 2 3
Run Code Online (Sandbox Code Playgroud)
我希望对数据进行重塑,使其最终成为矩阵:
Latitude 1/Longitude 2 Latitude 2/Longitude 4
Time 1 1 2
Time 2 3 Null
Run Code Online (Sandbox Code Playgroud)
我目前正在通过在唯一的经度/纬度组合上进行for循环,将每个另存为xarray,然后在经度/纬度维度上将它们串联来实现此目的。
有什么方法可以提高数据重塑的效率?