我有一个数据集,我在其中存储不同类/子类型的副本(不确定该叫什么),然后是每个类的属性。本质上,有 5 个亚型/类,每个亚型/类有 4 个重复,并且测量了 100 个属性。
是否有类似np.ravel或np.flatten可以使用 2 维合并的方法Xarray?
在这里,我想合并暗淡subtype,replicates所以我有一个二维数组(或pd.DataFrame带有attributes vs. subtype/replicates.
它不需要具有“coord_1 | coord_2”或任何格式。如果保留原始坐标名称会很有用。也许有类似的东西groupby可以做到这一点?Groupby总是让我感到困惑,所以如果它是原生的xarray,那就太棒了。
import xarray as xr
import numpy as np
# Set up xr.DataArray
dims = (5,4,100)
DA_data = xr.DataArray(np.random.random(dims), dims=["subtype","replicates","attributes"])
DA_data.coords["subtype"] = ["subtype_%d"%_ for _ in range(dims[0])]
DA_data.coords["replicates"] = ["rep_%d"%_ for _ in range(dims[1])]
DA_data.coords["attributes"] = ["attr_%d"%_ for _ in range(dims[2])]
# DA_data.coords
# Coordinates: …Run Code Online (Sandbox Code Playgroud) 我不知道如何从xr.Dataset对象中实际提取数据。我不知道如何访问单个值。如何像使用 DataArrays 一样从数据集中提取值(点值、向量、数组等)?
np.random.seed(0)
DA_data = xr.DataArray(np.random.random((3,2,10,100)), dims=["targets","accuracy","metrics","attributes"], name="Data")
DA_data.coords["attributes"] = ["attr_%d"%_ for _ in range(100)]
# DA_data.coords
# Coordinates:
# * targets (targets) int64 0 1 2
# * accuracy (accuracy) int64 0 1
# * metrics (metrics) int64 0 1 2 3 4 5 6 7 8 9
# * attributes (attributes) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
# Indexing DataArray
#DA_data.sel(targets=0, accuracy=0, …Run Code Online (Sandbox Code Playgroud) 我有一个python xarray数据集,time,x,y其维度和value1变量。我正在尝试计算value1每个x,y坐标对的年平均值。
我在阅读文档时遇到了这个功能:
ds.groupby('time.year').mean()
Run Code Online (Sandbox Code Playgroud)
这似乎是计算每个给定时间片中所有 x,y坐标对的单个年平均值,
而不是value1每个给定时间片中单个坐标对
的年平均值。 x,y
虽然上面的代码片段产生了错误的输出,但我对其过于简化的形式非常感兴趣。我真的很想找出“X-arrays 技巧”来为给定的x,y坐标对计算年平均值,而不是自己将其组合在一起。
有人指出我正确的方向吗?我应该暂时把它变成一个pandas对象吗?
我使用 xarray 从 openDAP 服务器读取单点数据,然后将 xarray 对象转换为数据帧。这很好用。我想在一次调用中读取多个点,但我不知道这是最好的方法。
这是我用于单点的代码:
import pandas as pd
import xarray as xr
url = 'http://nomads.ncep.noaa.gov:9090/dods/gfs_0p25/gfs20161111/gfs_0p25_00z'
lats = [40.1,40.5,42.3]
lons = [1.02,1.24,1.84]
vars = ['dswrfsfc', 'tmp2m', 'pressfc']
ds = xr.open_dataset(url)
data_single = ds.sel(lon=lons[0], lat=lats[0], method='nearest')
ts_dataframe_single = data_single[vars].to_dataframe()
Run Code Online (Sandbox Code Playgroud)
为了阅读多个要点,我这样做:
data = ds.sel(lon=lons, lat=lats, method='nearest')
ts_dataframe = data[vars].to_dataframe()
Run Code Online (Sandbox Code Playgroud)
这是输出data.coords:
data.coords
Out[10]:
Coordinates:
* time (time) datetime64[ns] 2016-11-11 2016-11-11T03:00:00 ...
* lev (lev) float64 1e+03 975.0 950.0 925.0 900.0 850.0 800.0 750.0 ...
* lat (lat) float64 …Run Code Online (Sandbox Code Playgroud) 我正在运行以下代码
positive_values = values.where(values > 0)
Run Code Online (Sandbox Code Playgroud)
在这个例子中values可能包含nan元素。我相信由于这个原因,我收到以下运行时警告:
RuntimeWarning: invalid value encountered in greater_equal if not reflexive
Run Code Online (Sandbox Code Playgroud)
是否xarray有抑制这些警告的方法?
我知道如何手动将 netCDF4.Dataset 转换为 xarray DataArray。但是,我想知道是否有任何简单而优雅的方法,例如使用 xarray 后端,将以下“netCDF4.Dataset”对象简单转换为 xarray DataArray 对象:
<type 'netCDF4.Dataset'>
root group (NETCDF4 data model, file format HDF5):
Originating_or_generating_Center: US National Weather Service, National Centres for Environmental Prediction (NCEP)
Originating_or_generating_Subcenter: NCEP Ensemble Products
GRIB_table_version: 2,1
Type_of_generating_process: Ensemble forecast
Analysis_or_forecast_generating_process_identifier_defined_by_originating_centre: Global Ensemble Forecast System (GEFS)
Conventions: CF-1.6
history: Read using CDM IOSP GribCollection v3
featureType: GRID
History: Translated to CF-1.0 Conventions by Netcdf-Java CDM (CFGridWriter2)
Original Dataset = /data/ldm/pub/native/grid/NCEP/GEFS/Global_1p0deg_Ensemble/member/GEFS_Global_1p0deg_Ensemble_20170926_0600.grib2.ncx3#LatLon_181X360-p5S-180p0E; Translation Date = 2017-09-26T17:50:23.259Z
geospatial_lat_min: 0.0
geospatial_lat_max: 90.0
geospatial_lon_min: 0.0 …Run Code Online (Sandbox Code Playgroud) 我正在使用xarray.open_mfdataset()函数读取多个 netCDF 格式的数据文件(WRF 模型输出文件)。我读和destaggering各种变量,如变量QVAPOR,U和VRESP。我正在使用以下代码读取 netCDF 变量并计算结果变量UQ。
import xarray as xr
def desta_var(pp,var):
flnm = xr.open_mfdataset(pp)
if var=="U":
U1 = (flnm.variables[var])
U = 0.5*(U1[:,:,:,0:-1] + U1[:,:,:,1:] )
del U1
return U
elif var=="V":
V1 = (flnm.variables[var])
V=0.5*(V1[:,:,0:-1,:] + V1[:,:,1:,:])
del V1
return V
else:
W1 = (flnm.variables[var])
W=0.5*(W1[:,0:-1,:,:] + W1[:,1:,:,:])
del W1
return W
U=desta_var('./WRF_3D_2005_*.nc','U')
V=desta_var('./WRF_3D_2005_*.nc','V')
flnm=xr.open_mfdataset('./WRF_3D_2005_*.nc')
QV = flnm.QVAPOR
UQ = U*QV
Run Code Online (Sandbox Code Playgroud)
使用上述代码获得的变量的维度和形状:
风变量的维数 Ex。U它的形状是
Times, lev, y, …
我正在尝试计算 xarray 数据集中时间维度子集的每月气候。时间是使用 datetime64 定义的。
如果我想使用整个时间序列,这很好用:
monthly_avr=ds_clm.groupby('time.month').mean(dim='time')
Run Code Online (Sandbox Code Playgroud)
但我真的只想要比 2001 年大的年份。这些都不起作用:
monthly_avr2=ds_clm.where(ds_clm.time>'2001-01-01').groupby('time.month').mean('time')
monthly_avr3=ds_clm.isel(time=slice('2001-01-01', '2018-01-01')).groupby('time.month').mean('time')
Run Code Online (Sandbox Code Playgroud)
这是我的数据集的样子:
<xarray.Dataset>
Dimensions: (hist_interval: 2, lat: 192, lon: 288, time: 1980)
Coordinates:
* lon (lon) float32 0.0 1.25 2.5 3.75 5.0 6.25 7.5 8.75 10.0 ...
* lat (lat) float32 -90.0 -89.057594 -88.11518 -87.172775 ...
* time (time) datetime64[ns] 1850-01-31 1850-02-28 1850-03-31 ...
Dimensions without coordinates: hist_interval
Data variables:
EFLX_LH_TOT (time, lat, lon) float32 0.26219246 0.26219246 0.26219246 ...
Run Code Online (Sandbox Code Playgroud)
有谁知道使用 datetime64 进行时间子集化的正确语法?
我正在尝试将xarray数据数组转换为机器学习项目的 Pandas 数据帧,但时间数据的cftime.DatetimeJulian格式似乎无法使用 Pandasto_datetime()方法进行转换。建议?谢谢。
nor_xr.time
<xarray.DataArray 'time' (time: 1372)>
array([cftime.DatetimeJulian(2015, 3, 31, 0, 0, 0, 0, 0, 90),
cftime.DatetimeJulian(2018, 12, 31, 0, 0, 0, 0, 6, 365)], dtype=object)
Coordinates:
* time (time) object 2015-03-31 00:00:00 ... 2018-12-31 00:00:00
Attributes:
standard_name: time
axis: T
nor_df = nor_xr.to_dataframe().reset_index()
nor_df.head()
time
0 2015-03-31 00:00:00
1 2015-04-01 00:00:00
pd.to_datetime(nor_df.time)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-104-1f0fc00ad825> in <module>
2
3 #|nor_df.time.unique()
----> 4 pd.to_datetime(nor_df.time)
~\AppData\Local\Continuum\anaconda3A\lib\site-packages\pandas\core\tools\datetimes.py in to_datetime(arg, …Run Code Online (Sandbox Code Playgroud) 我有一个名为 rio 的 DataArray 对象。
In [59]: rio
Out[59]:
<xarray.DataArray (band: 1, y: 106, x: 193)>
array([[[0, 0, ..., 0, 0],
[0, 0, ..., 0, 0],
...,
[0, 0, ..., 0, 0],
[0, 0, ..., 0, 0]]], dtype=uint8)
Coordinates:
* band (band) int32 1
* y (y) float64 -33.9 -33.95 -34.0 -34.05 ... -39.05 -39.1 -39.15 -39.2
* x (x) float64 140.8 140.8 140.9 140.9 ... 149.9 149.9 150.0 150.0
Attributes:
transform: (0.04791259799999997, 0.0, 140.776046753, 0.0, -0.0504760740...
crs: +init=epsg:4326
res: …Run Code Online (Sandbox Code Playgroud) python-xarray ×10
python ×6
arrays ×2
netcdf ×2
pandas ×2
dataset ×1
python-2.7 ×1
python-3.x ×1
time-series ×1
xarray ×1