- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在从事一个项目,该项目将原始二进制雷达数据从国家气象局 ftp 站点导入服务器。使用 Weather and Climate Toolkit 数据导出工具,我将数据转换为 netCDF 文件。以下是对 .nc 文件执行“ncdump -h”命令的结果:
netcdf last {
dimensions:
lat = 800 ;
lon = 1200 ;
time = 1 ;
variables:
double cref(time, lat, lon) ;
cref:long_name = "Level-III Composite Reflectivity (16 levels / 248 nm)" ;
cref:missing_value = -999. ;
cref:units = "dBZ" ;
double lat(lat) ;
lat:units = "degrees_north" ;
lat:spacing = "0.010995604400775773" ;
lat:datum = "NAD83 - NOAA Standard" ;
double lon(lon) ;
lon:units = "degrees_east" ;
lon:spacing = "0.010983926942902655" ;
lon:datum = "NAD83 - NOAA Standard" ;
int time(time) ;
time:units = "seconds since 1970-1-1" ;
// global attributes:
:title = "Level-III Composite Reflectivity (16 levels / 248 nm) 22:23:47 UTC 10/20/2016" ;
:Conventions = "CF-1.0" ;
:History = "Exported to NetCDF-3 CF-1.0 conventions by the NOAA Weather and Climate Toolkit (version 3.7.9) \n",
"Export Date: Thu Oct 20 16:11:07 EDT 2016" ;
:geographic_datum_ESRI_PRJ = "GEOGCS[\"GCS_North_American_1983\",DATUM[\"D_North_American_1983\",SPHEROID[\"GRS_1980\",6378137,298.257222101]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.0174532925199433]]" ;
:geographic_datum_OGC_WKT = "GEOGCS[\"NAD83\", DATUM[\"NAD83\", SPHEROID[\"GRS_1980\", 6378137.0, 298.25722210100002],TOWGS84[0,0,0,0,0,0,0]], PRIMEM[\"Greenwich\", 0.0], UNIT[\"degree\",0.017453292519943295], AXIS[\"Longitude\",EAST], AXIS[\"Latitude\",NORTH]]" ;
}
我想找到 cref 变量的最大条目,我可以使用 python 中的 netCDF4 和 numpy 库很容易地做到这一点:
import netCDF4
import numpy
netcdf = netCDF4.Dataset("last.nc")
var = netcdf.variables['cref']
print(numpy.nanmax(var))
print(numpy.nanmin(var))
但是,我希望过滤 netCDF 文件,以便仅在给定纬度/经度的特定距离内找到最大值和最小值。换句话说,我希望围绕指定的纬度/经度“裁剪”一个指定半径的圆。我找到了 how to crop a square通过另一个 SO 线程,但无法弄清楚圆圈是如何工作的。
最佳答案
我会计算中心与每个纬度/经度对(二维网格)之间的距离,并使用它来构建一个可以应用于数据的 mask 。屏蔽后,您可以再次简单地使用 numpy
函数来计算统计数据,例如 max()
。
例如,使用 https://stackoverflow.com/a/4913653/3581217 中的 haversine()
函数,修改为矢量化版本,您可以直接将其应用于 numpy
数组:
import numpy as np
import matplotlib.pylab as pl
def haversine(lon1, lat1, lon2, lat2):
# convert decimal degrees to radians
lon1 = np.deg2rad(lon1)
lon2 = np.deg2rad(lon2)
lat1 = np.deg2rad(lat1)
lat2 = np.deg2rad(lat2)
# haversine formula
dlon = lon2 - lon1
dlat = lat2 - lat1
a = np.sin(dlat/2)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2)**2
c = 2 * np.arcsin(np.sqrt(a))
r = 6371
return c * r
# Latitude / longitude grid
lat = np.linspace(50,54,16)
lon = np.linspace(6,9,12)
# Center coordinates
clat = 52
clon = 7
max_dist = 100 # max distance in km
# Calculate distance between center and all other lat/lon pairs
distance = haversine(lon[:,np.newaxis], lat, clon, clat)
# Mask distance array where distance > max_dist
distance_m = np.ma.masked_greater(distance, max_dist)
# Dummy data
data = np.random.random(size=[lon.size, lat.size])
# Test: set a value outside the max_dist circle to a large value:
data[0,0] = 10
# Mask the data array based on the distance mask
data_m = np.ma.masked_where(distance > max_dist, data)
pl.figure()
pl.subplot(221)
pl.title('distance (km)')
pl.pcolormesh(lon, lat, np.transpose(distance))
pl.colorbar()
pl.subplot(222)
pl.title('distance < max_dist (km)')
pl.pcolormesh(lon, lat, np.transpose(distance_m))
pl.colorbar()
pl.subplot(223)
pl.title('all data; max = {0:.1f}'.format(data.max()))
pl.pcolormesh(lon, lat, np.transpose(data))
pl.colorbar()
pl.subplot(224)
pl.title('masked data; max = {0:.1f}'.format(data_m.max()))
pl.pcolormesh(lon, lat, np.transpose(data_m))
pl.colorbar()
结果是:
关于python - 使用 Python 对 NetCDF 文件进行循环纬度/经度裁剪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40177960/
我有一个 1850-2005 年月地表气温的 netCDF 文件。如何在 unix 中截断文件,以便新文件的时间维度从 1855 年到 2005 年?反之亦然,截断文件,使其改为 1850-2000?
我有一个 NetCDF 文件,其中包含许多变量(1d、2d、3d 和 4d)。我想为 3d 变量之一添加一个新维度。 为了更清楚,假设: 我有一个 3d 变量:A(d1, d2, d3) 我想要 4d
我有 20 个包含海洋 CTD 数据的 netCDF 文件。每个文件包含相同的维度和变量名称,但它们的垂直坐标大小不同(即,CTD 近海剖面的深度范围比海上剖面小)。我需要将这些单独的文件连接成一个带
CDO 可以根据纬度和经度裁剪 netcdf 文件,只要它们以标准方式定义,而且我知道如果您知道索引范围,NCO 可以沿任何维度裁剪 netcdf 文件的子集你想要的,如这个相关问题的答案中所述: I
我有 40 个 NetCDF 文件,它们都构成了海洋模型的一个模拟。每个变量的时间序列数据被拆分为多个文件,因此目录列表如下所示: $ ls ./output/*.nc 1_hvel.nc
我正在尝试编辑 netcdf 文件中的全局属性之一: START_DATE = "2016-05-12_00:00:00" 我想将日期字符串更改为另一个日期。你如何用 nco 包做到这一点? 我已经看
我正在使用 netcdf 运算符将两个 NCEP netCDF 文件附加在一起。这些文件大小不同,但它们代表相同的大气变量,即位势高度。一个是 1000 hPa,另一个是 925 hPa。它们具有相同
我正在使用 CRU ts_4.04 数据学习 netCDF 和 CDO。我想计算伦敦降水量的月平均值和年总和。我写道: #!/usr/bin/bash lon=-0.11 lat=51.49 PREF
我正在连接 1000 个 nc 文件(模拟的输出),以便我可以在 Matlab 中更轻松地处理它们。为此,我使用 ncrcat。文件具有不同的大小,并且文件之间的时间变量不是唯一的。连接效果很好,使我
我想使用 nco 连接两组 netcdf 文件,每组大约有 30 个文件。 集合 1 包含:经度、纬度、时间和 v。 集合 2 包含:经度、纬度、时间和 u。 我已经尝试过: ncks *.nc ou
我正在使用 CRU ts_4.04 数据学习 netCDF 和 CDO。我想计算伦敦降水量的月平均值和年总和。我写道: #!/usr/bin/bash lon=-0.11 lat=51.49 PREF
我正在尝试使用 NCML 将 CF-1.4 文件“转换”为 CF-1.6。特别感兴趣的是如何 1) 删除维度,然后 2) 更改变量的维度。例如,下面是两个 ncdump 的顶部( netCDF )文件
有没有办法在 Windows 上将 grib 文件转换为 NetCDF 格式? 我使用一个名为 tkdegrib 的软件但它通过一个参数捕获一个参数,而我希望在同一个文件中包含所有 grib 的参数。
我已经下载了 netcdf 文件形式的气候模型输出,其中包含一个变量 (pr),适用于全世界,每天的时间步长。我的最终目标是获得欧洲的月度数据。 我以前从未使用过 netcdf 文件,而且我能找到的所
我正在尝试从现有 NetCDF 文件创建新的 NetCDF 文件。我只对使用 177 个变量列表中的 12 个变量感兴趣。您可以从此 ftp 站点 here 找到示例 NetCDF 文件。 . 我使用
我从 https://disc.gsfc.nasa.gov/datasets 下载了几天的每日 TRMM 3B42 数据.文件名的格式为 3B42_Daily.yyyymmdd.7.nc4.nc4 但
我有包含 6 小时间隔(每天 4 个文件)的 .grd 格式的大气数据的文件。我也有相关的描述 rune 件 (yyyymmddhh.ctl)。我可以使用 GrADS 绘制数据。但我需要将这些文件转换
我试图通过输入以下命令从多变量 netcdf 文件中提取变量: ncks -v ta temp1.nc out.nc 但是,然后我查看了 out.nc header ,所有变量仍然存在。 temp1.
我试图通过从另一个 NetCDf 文件(“源”文件)获取值来填充 NetCDF 文件(我们称之为“目标”文件)中的 nan 值。 【两个示例文件可以下载from here]我正在考虑使用以下框架在 p
我有 1 个 2007 年 9 月的 NetCDF 文件。它包含某些纬度/经度的 6 小时数据,其中包含风和湿度变量。每个变量的形状为 (120, 45, 93):120 次(一天 4 次),45 个
我是一名优秀的程序员,十分优秀!