如何使用存储在 netcdf 文件中的数据从时间序列中删除季节性数据?我想找到一个使用 Linux 的解决方案,同时我使用 Grads 和 Ferret 进行可视化。
多谢!
我有一个 netCDF 文件,其中包含特定时间南半球的多个气旋位置(纬度、经度)和气温。
\n我想要的是提取距离每个气旋位置中心 10 测地度(约 1110 公里)半径内的温度值 \xe2\x80\x8b\xe2\x80\x8b 。这个想法是确定与每个气旋相关的温度值 \xe2\x80\x8b\xe2\x80\x8b(假设距气旋中心的最大径向距离为 10\xc2\xba),并仅用这些温度绘制一个全局轮廓图价值观。
\n我在这里搜索了很多,但我只找到了适用于距一个特定纬度中心的距离的代码(例如:如何查找从纬度和经度值的中心位置开始的半径内的值)。
\n我陷入了如何同时将半正矢公式应用于多个中心的困境。
\nimport xarray as xr\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nd = xr.open_dataset(\'cyc_temp.nc\')\nlat = d[\'lat\']\nlon = d[\'lon\']\ncyc_pos = d[\'id\'][:,:]\ntemp = d[\'temp\'][:,:]\n\n# Haversine formula\n\ndef haversine(lon1, lat1, lon2, lat2):\n # convert decimal degrees to radians\n lon1 = np.deg2rad(lon1)\n lon2 = np.deg2rad(lon2)\n lat1 = np.deg2rad(lat1)\n lat2 = np.deg2rad(lat2)\n\n # haversine formula\n dlon = lon2 - lon1\n dlat = lat2 - lat1\n a = np.sin(dlat/2)**2 …Run Code Online (Sandbox Code Playgroud) 我有 netCDF 文件,其中包含某个位置的温度数据。数据形状为 1450x900。
我正在我的应用程序中创建搜索功能,以查找具有纬度、经度值的温度数据。
因此,我从 netCDf 文件中提取了纬度和经度坐标数据,但我期望它们是一维数组,而是得到两个坐标形状均为 1450x900 的二维数组。
所以我的问题是:为什么它们是二维数组,而不是 1450 个纬度值和 900 个经度值?1450 纬度值和 900 经度值不是描述整个网格吗?
假设我们有 4x5 的正方形,用于定位网格最右边和最底部点的索引将为 [4, 5]。所以我的 x 索引为 [1, 2, 3, 4],y 索引为:[1, 2, 3, 4, 5]。总共 9 个索引足以定位该网格(由 20 个单元格组成)上的任何点。那么为什么 netcdf 文件中的 lat (x) 和 lon (y) 坐标分别包含 20 个索引(总共 40 个),而不是分别包含 4 个和 5 个索引(总共 9 个)?希望你能明白我困惑的地方。
是否有可能以某种方式映射这些 2D 数组并“降级”到 1450 个纬度值和 900 个经度值?还是像现在这样就可以了?我如何使用这些价值观来实现我的意图?我需要压缩经纬度数组吗?
这是形状:
>>> DS = xarray.open_dataset('file.nc')
>>> DS.tasmin.shape
(31, 1450, 900)
>>> DS.projection_x_coordinate.shape
(900,)
>>> DS.projection_y_coordinate.shape
(1450,)
>>> …Run Code Online (Sandbox Code Playgroud) 我从 ECMWF 下载了 Grib 格式的 Era interim 数据。有没有办法将具有多个频段的 grib 文件转换为 netCDF4,同时保持频段为 NETCDF 格式?
我尝试使用 cdo 操作,但输出仅是 grib 文件的第一个区域。
cdo -f nc copy input.grib output.nc
Run Code Online (Sandbox Code Playgroud) 我正在使用 CRU ts_4.04 数据学习 netCDF 和 CDO。我想计算伦敦的月平均降水量和年降水量总和。我写:
#!/usr/bin/bash
lon=-0.11
lat=51.49
PREFNAME="/myHD/CRU4.04/pre/cru_ts4.04.1901.2019.pre.dat.nc"
OUTFNAME="outfile-"
echo "1970-2000 monthly average and annual sum of precipitations in London"
cdo remapnn,lon=$lon/lat=$lat $PREFNAME $OUTFNAME"place.nc"
cdo selvar,pre $OUTFNAME"place.nc" $OUTFNAME"var.nc"
cdo selyear,1970/2000 $OUTFNAME"var.nc" $OUTFNAME"years.nc"
cdo ymonmean $OUTFNAME"years.nc" $OUTFNAME"yearsmean.nc"
cdo timcumsum $OUTFNAME"yearsmean.nc" $OUTFNAME"yearsum.nc"
cdo info $OUTFNAME"yearsum.nc"
cdo info $OUTFNAME"yearsmean.nc"
exit
Run Code Online (Sandbox Code Playgroud)
我得到:
MyPC:~/workbench01$ ./gotit2.sh
1970-2000 monthly average and annual sum of precipitations in London
cdo remapnn: Nearest neighbor weights from lonlat (720x360) to lonlat (1x1) grid, with source mask (67420)
cdo …Run Code Online (Sandbox Code Playgroud) 我有一个“dataarray”,我正在尝试使用 roxarray 重新投影它。但是,当我使用 xarray.to_netcdf 进行重投影后,保存的文件是一个数据集,其中“spatial_ref”坐标转换为变量。我不确定是 xarray 还是 rioxarray.reprojection 导致了这种行为。以下是一些显示问题的代码:
import xarray as xr
import rioxarray
from pyproj import CRS
lst = xr.open_dataset("lst.nc") # File which carries the original CRS
luc = xr.open_rasterio("luc.tif") # File with the desired projection system
file_to_reproject = xr.open_dataarray("myfile.nc") # File to reproject
cc_lst = CRS.from_cf(lst.crs.attrs) # Get the CRS
cc_luc = luc.rio.crs
file_to_reproject = file_to_reproject.rio.write_crs(cc_lst) # write crs
file_reprojected= file_to_reproject.rio.reproject(cc_luc) #reproject the file
print(file_reprojected)
<xarray.DataArray (season: 4, y: 4343, x: 4172)>
array([[[nan, nan, nan, ..., nan, …Run Code Online (Sandbox Code Playgroud) 我试图将 netCDF 文件中的时间单位转换为正确的格式,但是,我得到了错误的输出。
我正在使用的数据的时间格式如下:
1 dimensions:
time Size:193458 *** is unlimited ***
units: seconds since 1970-1-1 00:00:00
Run Code Online (Sandbox Code Playgroud)
我使用包中的函数ncdf.tools来提取时间并将其转换为日期以进行时间序列分类,但得到了错误的结果:
convertDateNcdf2R(id_579$dim$time$vals, units="seconds")
[75] "1846-07-03 05:04:51 UTC"
[76] "1846-07-03 05:05:01 UTC"
[77] "1846-07-03 05:05:06 UTC"
[78] "1846-07-03 05:05:11 UTC"
[79] "1846-07-03 05:05:16 UTC"
Run Code Online (Sandbox Code Playgroud)
该日期不应超过 1970 年。是否有更好的替代方案?
创建这个的函数是:
convertDateNcdf2R = function(
##title<< Convert netCDF time vector to POSIXct R date object
time.source ##<< numeric vector or netCDF connection: either a number of time units since
## origin or a netCDF file connection, …Run Code Online (Sandbox Code Playgroud) 我想使用 xarray 创建一个数据集,并希望在创建数据集时向变量添加属性。xarray文档提供了一种添加全局属性的方法。例如如下:
ds = xr.Dataset(
data_vars=dict(
'temperature'=(["x", "y", "time"], temperature),
'precipitation'=(["x", "y", "time"], precipitation),
),
coords=dict(
lon=(["x", "y"], lon),
lat=(["x", "y"], lat),
time=time,
reference_time=reference_time,
),
attrs=dict(description="Weather related data."),)
Run Code Online (Sandbox Code Playgroud)
添加变量属性的一种方法是这样的:
ds['temperature'].attrs = {"units": K, '_FillValue': -999}
Run Code Online (Sandbox Code Playgroud)
但是,在我看来,这更像是更新属性。有没有办法在直接使用创建数据集时直接分配属性xr.Dataset?
我有140个阵列,其尺寸为734 x 1468.我需要在734 x 1468条目中的140个阵列中的平均值,我开始通过嵌套for循环迭代数据,但它太慢了.我试过使用这个np.mean功能
res = np.mean([megadatalist[i].variables['analysed_sst'][0] for i in range(0,140)], axis=2)
Run Code Online (Sandbox Code Playgroud)
res.shape 给出(140,734)
我需要尺寸734,1468的结果
megadatalist 由140个netCDF文件组成.
如何以编程方式列出我使用netCDF4和python读取的netCDF文件的所有变量:
import netCDF4
dset = netCDF4.Dataset('test.nc')
Run Code Online (Sandbox Code Playgroud) netcdf ×10
python ×6
cdo-climate ×3
coordinates ×1
dimensions ×1
eccodes ×1
grib ×1
haversine ×1
matplotlib ×1
mean ×1
nco ×1
netcdf4 ×1
numpy ×1
r ×1
time ×1
weather ×1