我正在使用 R 来处理气象数据。我分两步进行:
我还有一个问题:
2- 对于某些特定的 grib 文件,使用 ncar 工具进行转换不起作用。是否有其他方法或技巧(除了转录到 netcdf 中)来读取 R 中的 grib 文件?
Dirk 回答的问题:1- 我想在 R 中自动处理许多文件。我可以在 R 中调用 ncl_convert2nc 吗?(下面由 Dirk Eddelbuettel 回答)
我正在读取 NetCDF 文件,我想将每个数组作为浮点数组读取,然后将浮点数组写入新文件。如果我读取浮点数组,然后迭代数组中的每个元素(使用 DataOutputStream),我可以使其工作,但这非常非常慢,我的 NetCDF 文件超过 1GB。
我尝试使用 ObjectOutputStream,但这会写入额外的信息字节。
所以,回顾一下。1. 打开 NetCDF 文件 2. 从 NetCDF 文件读取浮点数组 x 3. 将浮点数组 x 一步写入原始数据文件 4. 使用 x+1 重复步骤 2
我min/max从 NetCDF 文件中提取变量数据值的常用方法与scipy.io.netcdf.
我正在处理相对较大的海洋模型输出文件(来自 ROMS),在给定的地图区域(夏威夷)上具有多个深度级别。当这些在 NetCDF-3 中时,我使用了scipy.io.netcdf.
现在这些文件在 NetCDF-4(“经典”)中,我不能再使用scipy.io.netcdf,而是切换到使用 netCDF4 Python 模块。但是,缓慢是一个问题,我想知道是否有更有效的方法来提取变量的数据范围(最小和最大数据值)?
这是我使用 scipy 的 NetCDF-3 方法:
import scipy.io.netcdf
netcdf = scipy.io.netcdf.netcdf_file(file)
var = netcdf.variables['sea_water_potential_temperature']
min = var.data.min()
max = var.data.max()
Run Code Online (Sandbox Code Playgroud)
这是我使用 netCDF4 的 NetCDF-4 方法:
import netCDF4
netcdf = netCDF4.Dataset(file)
var = netcdf.variables['sea_water_potential_temperature']
var_array = var.data.flatten()
min = var_array.data.min()
max = var_array.data.max()
Run Code Online (Sandbox Code Playgroud)
显着的区别是我必须首先展平 netCDF4 中的数据数组,而这个操作显然会减慢速度。
有没有更好/更快的方法?
这可能很简单,但我一直无法在线找到解决方案......我正在尝试使用一系列存储为 netcdf 文件的数据集。我打开每个文件,读入一些关键点,然后转到下一个文件。我发现我经常遇到 mmap 错误/脚本随着读取更多文件而变慢。我相信这可能是因为 netcdf 文件没有被 .close() 命令正确关闭。
我一直在测试这个:
from scipy.io.netcdf import netcdf_file as ncfile
f=ncfile(netcdf_file,mode='r')
f.close()
Run Code Online (Sandbox Code Playgroud)
那么如果我尝试
>>>f
<scipy.io.netcdf.netcdf_file object at 0x24d29e10>
Run Code Online (Sandbox Code Playgroud)
和
>>>f.variables['temperature'][:]
array([ 1234.68034431, 1387.43136567, 1528.35794546, ..., 3393.91061952,
3378.2844357 , 3433.06715226])
Run Code Online (Sandbox Code Playgroud)
所以看起来文件仍然打开?close() 实际上是做什么的?我怎么知道它起作用了?有没有办法从python关闭/清除所有打开的文件?
软件:Python 2.7.6、scipy 0.13.2、netcdf 4.0.1
我从这里下载了 netCDF 文件。它们的分辨率为 0.5*0.5。我想以更粗的 1*1 分辨率重新网格这些文件。我找到了一些链接。第一个链接讨论 R 中的重新网格,但不使用双线性插值。在第二个环节涉及双线性插值,但使用的气候数据运算符(到我不是很熟悉)。然后我遇到了一个 R 包HiClimR。在这个包中,一个命令 coarseR降低了数据的分辨率。我将 netCDF 文件转换为 excel 文件并使用coarseR. 但是得到结果后我发现这个命令实际上以某种方式跳过了经纬度并将分辨率降低到1 * 1。简而言之,我的问题是
(1)coarseR用于降低分辨率是否正确?(2) 如何将双线性变换用于我在 R 中的特定问题?
提前谢谢了。
我试图从 netCDF 文件中提取一组特定的数据,然后将所述数据转换为 GeoTIFF。
到目前为止,我已经设法使用 netCDF4 提取了我想要的数据,文件中的所有数据都存储为一维数组(lat、lon、我想要的数据)并将它们分配给一个二维数组。我正在使用的 netcdf 文件被子集化到特定区域。然而,从这里我不知所措。
通过我在这些链接中阅读的内容,我对 geotiff 转换的工作原理略有了解:
http://adventuresindevelopment.blogspot.co.uk/2008/12/create-geotiff-with-python-and-gdal.html
这是我目前所拥有的:
import netCDF4
import numpy as np
from osgeo import gdal
from osgeo import osr
#Reading in data from files and extracting said data
ncfile = netCDF4.Dataset("data.nc", 'r')
dataw = ncfile.variables["dataw"][:]
lat = ncfile.variables["Latitude"][:]
long = ncfile.variables["Longitude"][:]
n = len(dataw)
x = np.zeros((n,3), float)
x[:,0] = long[:]
x[:,1] = lat[:]
x[:,2] = dataw[:]
nx = len(long)
ny = len(lat)
xmin, ymin, xmax, ymax = [long.min(), lat.min(), …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Microsoft 的科学数据集库 (SDS)从 NetCDF 文件中提取数据。我仅限于使用 MS SDS 和 C#。我不是一名程序员,所以我正在努力让基础知识发挥作用。首先,我想编写一个简单的脚本来提取数据并将其写入 .csv 文件。使用介绍文档和 Codeplex 教程。我尝试编写一个简单的 C# 控制台应用程序,它只读取文件并将其写入控制台,或者理想情况下写入 .csv 文件。
使用 SDS 1.3 命令行我可以查看测试文件的内容:
D:\NetCDF>sds list test.nc
[2] ACPR of type Single (Time:85) (south_north:213) (west_east:165)
[1] Times of type SByte (Time:85) (DateStrLen:19)
D:\NetCDF>
Run Code Online (Sandbox Code Playgroud)
我的脚本如下所示:
using System;
using System.IO;
using sds = Microsoft.Research.Science.Data;
using Microsoft.Research.Science.Data.Imperative;
namespace NetCDFConsoleApp
{
class Program
{
static void Main(string[] args)
{
/// Gets the path to the NetCDF file to be used as a data source. …Run Code Online (Sandbox Code Playgroud) 假设我的时间数据在 xarray 数据集中如下所示:
ds = xr.Dataset({'time': pd.date_range('2000-01-01', periods=10)})
ds.to_netcdf('asdf.nc')
Run Code Online (Sandbox Code Playgroud)
xarray 的to_netcdf()方法将时间维度输出为 int64:
$ ncdump -v time asdf.nc
netcdf asdf {
dimensions:
time = 10 ;
variables:
int64 time(time) ;
time:units = "days since 2000-01-01 00:00:00" ;
time:calendar = "proleptic_gregorian" ;
data:
time = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ;
}
Run Code Online (Sandbox Code Playgroud)
因为我正在使用不支持 int64 的 THREDDS 服务器,所以我希望这些时间数据为 int32。使用 xarray 可以做到这一点吗?
我有一个进程fn每 5 分钟使用netcdf4.Dataset(fn, mode=a). 我还有一个使用 a xarray.Dataset(我想保留它,因为它非常方便)的NetCDF 文件的散景服务器可视化。
问题是 NetCDF-update-process 在尝试添加新数据时失败,fn如果它在我的散景服务器进程中通过
ds = xarray.open_dataset(fn)
Run Code Online (Sandbox Code Playgroud)
如果我使用该选项 autoclose
ds = xarray.open_dataset(fn, autoclose=True)
Run Code Online (Sandbox Code Playgroud)
更新fn与其他过程,同时ds在背景虚化服务器应用程序的作品“开放的”,但更新的背景虚化的人物,这拉从时间片fn,得到非常laggy。
我的问题是:有没有其他方法可以在使用时释放 NetCDF 文件的锁定xarray.Dataset?
我不在乎 xarray.Dataset 的形状是否只在重新加载整个散景服务器应用程序后才一致更新。
谢谢!
这是一个最小的工作示例:
把它放到一个文件中并让它运行:
import time
from datetime import datetime
import numpy as np
import netCDF4
fn = 'my_growing_file.nc'
with netCDF4.Dataset(fn, 'w') as nc_fh:
# create dimensions
nc_fh.createDimension('x', 90)
nc_fh.createDimension('y', 90)
nc_fh.createDimension('time', None)
# create variables
nc_fh.createVariable('x', …Run Code Online (Sandbox Code Playgroud) 我有 5 个带有系泊电流计数据的 netCDF 文件。每个文件看起来像这样:
<xarray.Dataset>
Dimensions: (BINDEPTH: 50, INSTRDEPTH: 3, LATITUDE: 5, LONGITUDE: 5, TIME: 44106)
Coordinates:
* INSTRDEPTH (INSTRDEPTH) float64 100.0 280.0 600.0
* LATITUDE (LATITUDE) float64 -34.04 -33.8 -33.67 -33.56 -33.51
* LONGITUDE (LONGITUDE) float64 27.57 27.59 27.64 27.72 27.86
* TIME (TIME) datetime64[ns] 2015-04-11T15:00:00 ...
Dimensions without coordinates: BINDEPTH
Data variables:
PRES (TIME, INSTRDEPTH) float32 dask.array<shape=(44106, 3), chunksize=(44106, 3)>
VCUR (TIME, BINDEPTH) float32 dask.array<shape=(44106, 50), chunksize=(44106, 50)>
UCUR (TIME, BINDEPTH) float32 dask.array<shape=(44106, 50), chunksize=(44106, 50)>
WCUR …Run Code Online (Sandbox Code Playgroud) netcdf ×10
python ×5
r ×2
arrays ×1
c# ×1
cdo-climate ×1
concurrency ×1
csv ×1
geospatial ×1
geotiff ×1
grib ×1
java ×1
numpy ×1
python-3.x ×1
scipy ×1