【发布时间】:2014-05-20 23:04:28
【问题描述】:
我正在尝试通过 Python 将 .csv 文件转换为 netCDF4,但我无法弄清楚如何将 .csv 表格式的信息存储到 netCDF 中。我主要关心的是我们如何将列中的变量声明为可行的 netCDF4 格式?我发现的一切通常都是从 netCDF4 中提取信息到 .csv 或 ASCII 中。我提供了示例数据、示例代码和我声明适当数组的错误。任何帮助将不胜感激。
示例表如下:
Station Name Country Code Lat Lon mn.yr temp1 temp2 temp3 hpa
Somewhere US 12340 35.52 23.358 1.19 -8.3 -13.1 -5 69.5
Somewhere US 12340 2.1971 -10.7 -13.9 -7.9 27.9
Somewhere US 12340 3.1971 -8.4 -13 -4.3 90.8
我的示例代码是:
#!/usr/bin/env python
import scipy
import numpy
import netCDF4
import csv
from numpy import arange, dtype
#声明空数组
v1 = []
v2 = []
v3 = []
v4 = []
# 打开 csv 文件并为每个标题的数组声明变量
f = open('station_data.csv', 'r').readlines()
for line in f[1:]:
fields = line.split(',')
v1.append(fields[0]) #station
v2.append(fields[1])#country
v3.append(int(fields[2]))#code
v4.append(float(fields[3]))#lat
v5.append(float(fields[3]))#lon
#more variables included but this is just an abridged list
print v1
print v2
print v3
print v4
#convert 到 netcdf4 框架,作为 netcdf 工作
ncout = netCDF4.Dataset('station_data.nc','w')
# 纬度和经度。包含缺失数字的 NaN
lats_out = -25.0 + 5.0*arange(v4,dtype='float32')
lons_out = -125.0 + 5.0*arange(v5,dtype='float32')
# 输出数据。
press_out = 900. + arange(v4*v5,dtype='float32') # 1d array
press_out.shape = (v4,v5) # reshape to 2d array
temp_out = 9. + 0.25*arange(v4*v5,dtype='float32') # 1d array
temp_out.shape = (v4,v5) # reshape to 2d array
# 创建纬度和经度维度。
ncout.createDimension('latitude',v4)
ncout.createDimension('longitude',v5)
# 定义坐标变量。他们将保存坐标信息
lats = ncout.createVariable('latitude',dtype('float32').char,('latitude',))
lons = ncout.createVariable('longitude',dtype('float32').char,('longitude',))
# 将单位属性分配给坐标 var 数据。这将文本属性附加到每个坐标变量,包含单位。
lats.units = 'degrees_north'
lons.units = 'degrees_east'
#将数据写入坐标变量。
lats[:] = lats_out
lons[:] = lons_out
#创建压力和温度变量
press = ncout.createVariable('pressure',dtype('float32').char,('latitude','longitude'))
temp = ncout.createVariable('temperature',dtype('float32').char,'latitude','longitude'))
#设置单位属性。
press.units = 'hPa'
temp.units = 'celsius'
# 将数据写入变量。
press[:] = press_out
temp[:] = temp_out
ncout.close()
f.close()
错误:
Traceback (most recent call last):
File "station_data.py", line 33, in <module>
v4.append(float(fields[3]))#lat
ValueError: could not convert string to float:
【问题讨论】:
-
错误提示
fields[3]中的值不是数字,因此无法转换为浮点数。检查您的输入文件中的该值。您还可以尝试打印fields[3]的值,然后再将其转换为浮点数并添加到列表v4 -
非常感谢您澄清这一点。你是对的,只需打印它就可以了,但我不相信它在进入 netcdf 时会很好地传输。这些是纬度,因此通过为它们分配任何数据类型,在转移到 netcdf 时可以吗?