I've created a xarray.DataArray and I save it using xarray.DataArray.to_netcdf.
I create it using:
datatmp = np.full([nens, len(modanom.coords['time'].values), len(modanom.coords['latitude'].values), len(modanom.coords['longitude'].values)], np.nan)
b = xr.DataArray(datatmp, coords=[range(1,nens + 1), modanom.coords['time'], modanom.coords['latitude'], modanom.coords['longitude']], dims=['ensemble', 'time', 'latitude', 'longitude'])
Run Code Online (Sandbox Code Playgroud)
i.e. I don't specify a name such as:
b = xr.DataArray({'windspeed': (('ensemble', 'time', 'latitude', 'longitude'), datatmp)}, coords=[range(1,nens + 1), modanom.coords['time'], modanom.coords['latitude'], modanom.coords['longitude']], dims=['ensemble', 'time', 'latitude', 'longitude'])
Run Code Online (Sandbox Code Playgroud)
I do some manipulation of this file and obtain root mean square error and the resultant xarray.Dataset is
<xarray.DataArray …Run Code Online (Sandbox Code Playgroud) 是否有比 xarray 数据集中的所有 DataArray 更好的求和方法
sum(d for d in ds.data_vars.values())
Run Code Online (Sandbox Code Playgroud)
这有效,但似乎有点笨拙。是否有等价于对 Pandas DataFrame 列求和?
请注意该ds.sum()方法适用于每个 DataArrays - 但我想组合 DataArrays。
我正在使用 xarray 将文本文件转换为 netCDF 格式。当我使用 netCDF4 格式和 Python3 时,它将字符串变量存储为字符串,但当我使用 Python2 时,它将它们存储为 n 维字符数组。我试图在编码中设置 dtype='str' 并且没有任何区别。有没有办法使用 Python2 使这些变量具有字符串数据类型?任何想法将不胜感激。
这是我的代码:
import pandas as pd
import xarray as xr
column_names = ['timestamp', 'air_temp', 'vtempdiff', 'rh', 'pressure', 'wind_dir', 'wind_spd']
df = pd.read_csv(args.input_file, skiprows = 1, header=None, names = column_names)
ds = xr.Dataset.from_dataframe(df)
encoding = {'timestamp': {'dtype': 'str'},
'air_temp': {'_FillValue': 9.96921e+36, 'dtype': 'f4'}
}
ds.to_netcdf(op_file.nc, format = 'NETCDF4', unlimited_dims={'time':True}, encoding = encoding)
Run Code Online (Sandbox Code Playgroud)
当我使用 Python3.6 对 op_file.nc 进行 ncdump 时,我得到:
netcdf op_file {
dimensions:
time = …Run Code Online (Sandbox Code Playgroud) 我有一个 .nc 文件作为 xarray 中的数据集打开,其结构如下:
ds
<xarray.Dataset>
Dimensions: (lat: 733, lon: 720, time: 204)
Coordinates:
* time (time) int16 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...
Dimensions without coordinates: lat , lon
Data variables :
latitude (lat) float32 56.0 55.9917 55.9833 55.975 55.9667 55.9583 ...
longitude (lon) float32 -11.0 -10.9917 -10.9833 -10.975 -10.9667 ...
n2o (lat, lon, time) float64 nan nan nan nan nan nan nan nan …Run Code Online (Sandbox Code Playgroud) 我有一个 xarray DataArray,其中包含多天的数据。我可以使用 .where 函数为一个条件屏蔽它,但我想让所有值超过某个值 1 并且所有值低于该值 0。理想情况下,我还想确保任何 np.数据集中的 nans 没有改变,但这不是必需的。
import numpy as np
import xarray as xr
dval = np.random.randint(5,size=[3,4,4])
x = [0,1,2,3]
y = [0,1,2,3]
time = ['2017-10-13','2017-10-12','2017-10-11']
a = xr.DataArray(dval,coords=[time,x,y],dims=['time','x','y'])
a = a.where(a>2,1,0) #ideally this would work as (condition,True val, False val)
Run Code Online (Sandbox Code Playgroud)
这会导致“如果 drop=True 则无法设置‘其他’”的 ValueError
对此的任何帮助将不胜感激。
有没有xArray办法在DataArray.rolling窗口上计算分位数?列出的可用方法包括mean或median,但没有关于分位数/百分位数。我想知道这是否可以以某种方式完成,即使没有直接的方法。
目前,我正在本地将xArray数据迁移到 a pandas.DataFrame,我在其中应用了rolling().quantile()序列。之后,我采用新的值DataFrame并xArray.DataArray从中构建一个。可重现的代码:
import xarray as xr
import pandas as pd
import numpy as np
times = np.arange(0, 30)
locs = ['A', 'B', 'C', 'D']
signal = xr.DataArray(np.random.rand(len(times), len(locs)),
coords=[times, locs], dims=['time', 'locations'])
window = 5
df = pd.DataFrame(data=signal.data)
roll = df.rolling(window=window, center=True, axis=0).quantile(.25).dropna()
window_array = xr.DataArray(roll.values,
coords=[np.arange(0, signal.time.shape[0] - window + 1), signal.locations],
dims=['time', 'locations'])
Run Code Online (Sandbox Code Playgroud)
欢迎任何xArray尽可能多地坚持的线索。
让我们考虑同样的问题,只是规模更小(10 个时间实例,2 个位置)。 …
为什么numpy.angle()不是一个 numpy 通用函数(ufunc)?
它似乎符合numpy 文档中ufunc 的标准,但未列为其中之一。
我认为它可能不符合定义,因为它转换了数字的类型(从复数到实数),但是已经有其他 ufunc 可以做到这一点(例如np.absolute)。
我遇到这个是因为我试图np.angle直接应用于包含复数的 xarray DataArray,它返回一个 numpy 数组而不是 xarray DataArray。我认为它这样做是因为它不是一个 numpy ufunc,并且 xarray 会检查它。
我有一个 DataArray 对象,用于跨越几年的日常数据集。这有一个变量和三个维度,分别命名为latitude,longitude和time(daily)。时间坐标就像time (time) datetime64[ns] 2016-01-01 2016-01-02 ... 2018-12-31
我想通过 DataArray 的 groupby 函数按年和月的组合对数据进行分组。但是下面的代码只给了我 中的时间坐标int64,比如 1, 2, 3, ..., 12。
da_groupby_monthly = da.groupby('time.month').sum('time')
print(da_groupby_monthly)
Run Code Online (Sandbox Code Playgroud)
输出:
<xarray.DataArray (month: 12, latitude: 106, longitude: 193)>
dask.array<shape=(12, 106, 193), dtype=int32, chunksize=(1, 106, 193)>
Coordinates:
* latitude (latitude) float32 -39.2 -39.149525 ... -33.950478 -33.9
* longitude (longitude) float32 140.8 140.84792 140.89584 ... 149.95209 150.0
* month (month) int64 1 2 3 4 5 6 7 8 …Run Code Online (Sandbox Code Playgroud) 全部。我正在使用 Dask 分布式集群在循环内编写 Zarr+Dask 支持的 Xarray 数据集,并且dataset.to_zarr正在阻塞。当存在阻碍循环继续的散乱块时,这确实会减慢速度。有没有办法.to_zarr异步执行,以便循环可以继续下一个数据集写入而不会被一些落后的块所阻碍?
python-xarray ×10
python ×6
netcdf ×2
numpy ×2
dask ×1
data-masking ×1
geoviews ×1
netcdf4 ×1
pandas ×1
python-3.x ×1
quantile ×1
xarray ×1
zarr ×1