测量海浪周期的变量的“单位”属性以“秒”为单位。这不是日期时间字段,但 xarray 会自动将此变量提取为 timedelta64。由于单位不是“自...以来的秒数”,我认为 xarray 应该将其视为普通的 float32 数据数组,但显然并非如此。有没有办法让我告诉 xarray 将波浪周期变量作为 float32 摄取,或者在摄取后将它们从 timedelta64 转换回原始值?我仍然希望它将“时间”变量转换为 timedelta64,所以我不想关闭整个数据集的翻译,而只是针对特定变量(Tper、sper、wper)。
以下是我在 TDS 服务器中的波浪预测中使用的基本 OPeNDAP URL:
建议?谢谢!
您可以使用此处的 OPeNDAP 页面查看类似“ncdump”的输出:
或者您可以在 OPeNDAP URL 上运行 ncdump,如下所示:
结果如下:
netcdf WaveWatch_III_Hawaii_Regional_Wave_Model_best {
dimensions:
lat = 101 ;
lon = 141 ;
time = 54453 ;
z = 1 ;
variables:
float lon(lon) ;
lon:units = "degrees_east" ;
lon:long_name = "longitude" ;
lon:standard_name = "longitude" ;
lon:short_name = "lon" ;
lon:axis = "x" ;
lon:_CoordinateAxisType …Run Code Online (Sandbox Code Playgroud) 我有一个经典的 xarray 数据集。这些是月度数据(38 年的月度数据)。
\n\n我有兴趣分别计算每个月的分位数值。
\n\n<xarray.Dataset>\nDimensions: (lat: 26, lon: 71, time: 456)\nCoordinates:\n * lat (lat) float32 25.0 26.0 27.0 28.0 29.0 30.0 31.0 32.0 ...\n * lon (lon) float32 -130.0 -129.0 -128.0 -127.0 -126.0 -125.0 ...\n * time (time) datetime64[ns] 1979-01-31 1979-02-28 1979-03-31 ...\nData variables:\n var1 (time, lat, lon) float32 nan nan nan nan nan nan nan nan ...\n var2 (time, lat, lon) float32 nan nan nan nan nan nan nan nan ...\n var3 (time, lat, lon) float32 …Run Code Online (Sandbox Code Playgroud) 我有一个arr带有坐标“时间”的数据数组。
arr:
<xarray.DataArray 'T' (time: 731)>
array([244.40161, 244.39998, ..., 244.40936, 244.40549], dtype=float32)
Coordinates:
* time (time) datetime64[ns] 1979-01-01T09:00:00 ... 1980-12-31T09:00:00
Run Code Online (Sandbox Code Playgroud)
提取前5个时间坐标, arr.time.values[:5]:
array(['1979-01-01T09:00:00.000000000', '1979-01-02T09:00:00.000000000',
'1979-01-03T09:00:00.000000000', '1979-01-04T09:00:00.000000000',
'1979-01-05T09:00:00.000000000'], dtype='datetime64[ns]')
Run Code Online (Sandbox Code Playgroud)
我希望我的日期时间的格式只是 等'1979-01-01','1979-01-02'没有时间,或者将时间标准化为 00:00:00。
pandas 数据框架有一些解决方案,但我不太确定如何在这里应用它们,因为这些函数不适用(在 datetime、Timestamp 和 datetime64 之间转换,使用 pandas.to_datetime 时仅保留日期部分)
我有一个 DataArray,我想将其转换为 numpy 数组。作为参考,它是一个包含(时间、纬度、经度)的三维网格数据集。我尝试使用 xarray.DataArray.values(),但收到错误: TypeError: 'property' object is not callable。
我想将其转换为 numpy 数组,因为我使用的函数利用了重塑功能,并且无法与 DataArray 一起正常工作。我尝试使用 np.array() 将其简单地转换为 numpy 数组,但它会将每个值转换为 NaN。
datatlt=xr.open_dataset("/nfs/home11/staff/lzhou/Public/Satellite_data/RSS_Tb_Anom_Maps_ch_TLT_V4_0.nc", decode_times=False)
tlt=datatlt['brightness_temperature'].sel(months=slice(121,492))
tlt2=np.ma.masked_invalid(tlt)
tlt2=xr.DataArray.values(tlt2)
Run Code Online (Sandbox Code Playgroud) 我正在尝试计算 xarray 中两个数据集沿时间维度的相关性。我的数据集都是纬度 x 经度 x 时间。我的一个数据集有足够的数据丢失,这对于插值和消除间隙是不合理的,相反,我想忽略丢失的值。我有一些简单的代码可以在一定程度上发挥作用,但没有一个适合我的具体用例。例如:
def covariance(x,y,dims=None):
return xr.dot(x-x.mean(dims), y-y.mean(dims), dims=dims) / x.count(dims)
def correlation(x,y,dims=None):
return covariance(x,y,dims) / (x.std(dims) * y.std(dims))
Run Code Online (Sandbox Code Playgroud)
如果没有丢失数据,则效果很好,但当然不能与 nan 一起使用。虽然这里有一个为 xarray 编写的很好的例子,但即使使用这段代码,我仍在努力计算皮尔逊的相关性而不是斯皮尔曼的相关性。
import numpy as np
import xarray as xr
import bottleneck
def covariance_gufunc(x, y):
return ((x - x.mean(axis=-1, keepdims=True))
* (y - y.mean(axis=-1, keepdims=True))).mean(axis=-1)
def pearson_correlation_gufunc(x, y):
return covariance_gufunc(x, y) / (x.std(axis=-1) * y.std(axis=-1))
def spearman_correlation_gufunc(x, y):
x_ranks = bottleneck.rankdata(x, axis=-1)
y_ranks = bottleneck.rankdata(y, axis=-1)
return pearson_correlation_gufunc(x_ranks, y_ranks)
def spearman_correlation(x, y, …Run Code Online (Sandbox Code Playgroud) 我有一个 NC 文件(时间、纬度、经度)从这里下载,我正在尝试提取多个站点的时间序列(纬度/经度点从这里下载)。所以我尝试用这种方式读取坐标并从 NC 文件中提取最接近的值:
import pandas as pd
import xarray as xr
nc_file = r"C:\Users\lab\Desktop\harvey\example.nc"
NC = xr.open_dataset(nc_file)
csv = r"C:\Users\lab\Desktop\harvey\stations.csv"
df = pd.read_csv(csv,delimiter=',')
Newdf = pd.DataFrame([])
# grid point lists
lat = df["Lat"]
lon = df["Lon"]
point_list = zip(lat,lon)
for i, j in point_list:
dsloc = NC.sel(lat=i,lon=j,method='nearest')
DT=dsloc.to_dataframe()
Newdf=Newdf.append(DT,sort=True)
Run Code Online (Sandbox Code Playgroud)
该代码工作正常并返回:
EVP lat lon
time
2019-01-01 19:00:00 0.0546 40.063 -88.313
2019-01-01 23:00:00 0.0049 40.063 -88.313
2019-01-01 19:00:00 0.0052 41.938 -93.688
2019-01-01 23:00:00 0.0029 41.938 -93.688 …Run Code Online (Sandbox Code Playgroud) 摘要:我有一个数据集,其收集方式使得维度最初不可用。我想获取本质上是一大块无差别的数据,并为其添加维度,以便可以对其进行查询、子集化等。这是以下问题的核心。
这是我拥有的 xarray 数据集:
<xarray.Dataset>
Dimensions: (chain: 1, draw: 2000, rows: 24000)
Coordinates:
* chain (chain) int64 0
* draw (draw) int64 0 1 2 3 4 5 6 7 ... 1993 1994 1995 1996 1997 1998 1999
* rows (rows) int64 0 1 2 3 4 5 6 ... 23994 23995 23996 23997 23998 23999
Data variables:
obs (chain, draw, rows) float64 4.304 3.985 4.612 ... 6.343 5.538 6.475
Attributes:
created_at: 2019-12-27T17:16:13.847972
inference_library: pymc3
inference_library_version: 3.8
Run Code Online (Sandbox Code Playgroud)
这里的维度rows …
我有一个 pandas 空间数据数据框,我想将其转换为 netCDF。我找到了 xarray 的方法并将我的数据框转换为 xarray 数据集:
# create xray Dataset from Pandas DataFrame
xr = xarray.Dataset.from_dataframe(df)
Run Code Online (Sandbox Code Playgroud)
现在,我想将lon和lat变量设置为 xarray 数据集的坐标。我已经尝试过xarray.Dataset.assign_coords,但似乎无法让它发挥作用?
我的 xarray 数据集如下所示:
<xarray.Dataset>
Dimensions: (index: 58705)
Coordinates:
* index (index) int64 0 1 2 3 4 5 6 ... 58699 58700 58701 58702 58703 58704
Data variables:
x_km (index) float64 5.274e+03 5.273e+03 ... 2.873e+03 2.873e+03
y_km (index) float64 0.0 46.02 92.03 138.0 ... -75.23 -50.15 -25.07 -0.0
z_km (index) float64 3.575e+03 3.575e+03 …Run Code Online (Sandbox Code Playgroud) 我想要操作 xarray.DataArray 内的数据,但是,它无法更改 DataArray 中的各个条目。
例子:
import numpy as np
import xarray as xr
data = np.random.rand(2,2)
times = [1998,1999]
locations = ['It','Be']
A = xr.DataArray(data, coords = [times, locations], dims = [time, space])
Run Code Online (Sandbox Code Playgroud)
这给了我一个 DataArray。现在我想手动将 (1998,'It') 的条目设置为 5,但以下方法不起作用:
A.sel(time = 1998, space = 'It').values = 5
Run Code Online (Sandbox Code Playgroud)
这都不起作用:
A.sel(time = 1998, space = 'It').values = array(5)
Run Code Online (Sandbox Code Playgroud)
数据保持原样。然而,奇怪的是,以下效果很好:
A.sel(time = 1998).values[0] = 5
Run Code Online (Sandbox Code Playgroud)
你能解释一下这背后的逻辑吗?