我正在尝试使用Python将.csv文件转换为netCDF4,但我无法弄清楚如何将.csv表格格式中的信息存储到netCDF中。我的主要问题是如何将列中的变量声明为可处理的netCDF4格式? 我所找到的所有内容通常都是从netCDF4中提取信息到.csv或ASCII中。我已经提供了示例数据、示例代码和声明适当数组时出现的错误。任何帮助都将不胜感激。
以下是样本表:
我的样例代码如下: #!/usr/bin/env python
错误:
以下是样本表:
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
#将数据转换为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',))
# 将单位属性分配给坐标变量数据。 这将把一个文本属性附加到每个坐标变量上,其中包含单位。
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]
中的值不是数字,因此无法转换为浮点数。请检查输入文件中该值。 您还可以尝试在将其转换为浮点数并添加到列表v4
之前打印fields[3]
的值。 - vaibhaw