- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的目标是从 netcdf 文件访问数据并写入以下格式的 CSV 文件。
Latitude Longitude Date1 Date2 Date3
100 200 <-- MIN_SFC values -->
到目前为止,我已经访问了变量,将标题写入文件并填充了纬度/经度。
如何访问指定经度、纬度坐标和日期的 MIN_SFC 值,然后写入 CSV 文件。
我是 python 新手,如果有更好的方法,请告诉我。
NetCDF 文件信息:
Dimensions:
time = 7
latitude = 292
longitude =341
Variables:
float MIN_SFC (time=7, latitude = 292, longitude = 341)
这是我尝试过的:
from netCDF4 import Dataset, num2date
filename = "C:/filename.nc"
nc = Dataset(filename, 'r', Format='NETCDF4')
print nc.variables
print 'Variable List'
for var in nc.variables:
print var, var.units, var.shape
# get coordinates variables
lats = nc.variables['latitude'][:]
lons = nc.variables['longitude'][:]
sfc= nc.variables['Min_SFC'][:]
times = nc.variables['time'][:]
# convert date, how to store date only strip away time?
print "Converting Dates"
units = nc.variables['time'].units
dates = num2date (times[:], units=units, calendar='365_day')
#print [dates.strftime('%Y%m%d%H') for date in dates]
header = ['Latitude', 'Longitude']
# append dates to header string
for d in dates:
print d
header.append(d)
# write to file
import csv
with open('Output.csv', 'wb') as csvFile:
outputwriter = csv.writer(csvFile, delimiter=',')
outputwriter.writerow(header)
for lat, lon in zip(lats, lons):
outputwriter.writerow( [lat, lon] )
# close the output file
csvFile.close()
# close netcdf
nc.close()
更新:
我已经更新了写入 CSV 文件的代码,有一个属性错误,因为纬度/经度是 double 的。
AttributeError: 'numpy.float32' 对象没有属性 'append'
有什么方法可以在 python 中转换为字符串?你认为它会起作用吗?
当我将值打印到控制台时,我注意到许多值返回为“--”。我想知道这是否表示定义为 -32767.0 的 fillValue 或 missingValue。
我还想知道是否应该通过 lats = nc.variables['latitude'][:][:] 或 lats = nc.variables['latitude'][:][ 访问 3d 数据集的变量:,:] ?
# the csv file is closed when you leave the block
with open('output.csv', 'wb') as csvFile:
outputwriter = csv.writer(csvFile, delimiter=',')
for time_index, time in enumerate(times): # pull the dates out for the header
t = num2date(time, units = units, calendar='365_day')
header.append(t)
outputwriter.writerow(header)
for lat_index, lat in enumerate(lats):
content = lat
print lat_index
for lon_index, lon in enumerate(lons):
content.append(lon)
print lon_index
for time_index, time in enumerate(times): # for a date
# pull out the data
data = sfc[time_index,lat_index,lon_index]
content.append(data)
outputwriter.writerow(content)
最佳答案
我会将数据加载到 Pandas 中,这有助于分析和绘制时间序列数据,以及写入 CSV。
这是一个真实的工作示例,它从全局预测模型数据集中的指定经纬度位置提取波高的时间序列。
注意:这里我们访问一个 OPeNDAP 数据集,这样我们就可以从远程服务器中提取我们需要的数据,而无需下载文件。但是 netCDF4 对于删除的 OPeNDAP 数据集或本地 NetCDF 文件的工作方式完全相同,这是一个非常有用的功能!
import netCDF4
import pandas as pd
import matplotlib.pyplot as plt
# NetCDF4-Python can read a remote OPeNDAP dataset or a local NetCDF file:
url='http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/WW3/Global/Best'
nc = netCDF4.Dataset(url)
nc.variables.keys()
lat = nc.variables['lat'][:]
lon = nc.variables['lon'][:]
time_var = nc.variables['time']
dtime = netCDF4.num2date(time_var[:],time_var.units)
# determine what longitude convention is being used [-180,180], [0,360]
print lon.min(),lon.max()
# specify some location to extract time series
lati = 41.4; loni = -67.8 +360.0 # Georges Bank
# find closest index to specified value
def near(array,value):
idx=(abs(array-value)).argmin()
return idx
# Find nearest point to desired location (could also interpolate, but more work)
ix = near(lon, loni)
iy = near(lat, lati)
# Extract desired times.
# 1. Select -+some days around the current time:
start = dt.datetime.utcnow()- dt.timedelta(days=3)
stop = dt.datetime.utcnow()+ dt.timedelta(days=3)
# OR
# 2. Specify the exact time period you want:
#start = dt.datetime(2013,6,2,0,0,0)
#stop = dt.datetime(2013,6,3,0,0,0)
istart = netCDF4.date2index(start,time_var,select='nearest')
istop = netCDF4.date2index(stop,time_var,select='nearest')
print istart,istop
# Get all time records of variable [vname] at indices [iy,ix]
vname = 'Significant_height_of_wind_waves_surface'
#vname = 'surf_el'
var = nc.variables[vname]
hs = var[istart:istop,iy,ix]
tim = dtime[istart:istop]
# Create Pandas time series object
ts = pd.Series(hs,index=tim,name=vname)
# Use Pandas time series plot method
ts.plot(figsize(12,4),
title='Location: Lon=%.2f, Lat=%.2f' % ( lon[ix], lat[iy]),legend=True)
plt.ylabel(var.units);
#write to a CSV file
ts.to_csv('time_series_from_netcdf.csv')
两者都创建此图以验证您是否已获得所需的数据:
并将所需的 CSV 文件 time_series_from_netcdf.csv
写入磁盘。
关于python - 如何使用 Python 读取 NetCDF 文件并写入 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28420988/
我有一个 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 个
我是一名优秀的程序员,十分优秀!