我无法将netCDF文件(屏蔽的numpy数组)转换为csv文件。 netcdf文件是从12个独立的文件中压缩而成,形成一个12 x 52 x 39的3D数组,其中12个对应于月份,52个对应于纬度和29个经度。
更新: 我想要的csv输出是4列,网格号(0-437),纬度,经度和总降水量。 e.g:
grid number| latitude| longitude| Total_precipitation
0 60.5000 -1.2345 800.123
1 . . .
2 . . .
我想总结我12个月的降水量并将数据压缩成一列。 (我在这里找不到任何答案来帮助我这样做)
目前我已经设法读取netCDF文件并将其保存为csv,但格式错误(参见方法1-3)。
这是我到目前为止所做的:
###################
# importing modules
###################
import pandas as pd
import numpy as np
import os
import sys
#import csv
from netCDF4 import Dataset
#setting up directory
CURRENT_DIR = os.path.abspath(os.curdir)
precip_path = os.path.join(CURRENT_DIR + '/CLIM8Splash/input/futureCLIM8/precip_2070_2099CDF')
sys.path.append(precip_path)
# reading precip netcdf
os.chdir('CLIM8_splash/input/futureCLIM8/precip_2070_2099CDF/')
files = ['jan_precip_2070_2099CDF.nc', 'feb_precip_2070_2099CDF.nc', 'mar_precip_2070_2099CDF.nc', 'apr_precip_2070_2099CDF.nc','may_precip_2070_2099CDF.nc', 'jun_precip_2070_2099CDF.nc', 'jul_precip_2070_2099CDF.nc', 'aug_precip_2070_2099CDF.nc', 'sep_precip_2070_2099CDF.nc', 'oct_precip_2070_2099CDF.nc', 'nov_precip_2070_2099CDF.nc', 'dec_precip_2070_2099CDF.nc']
#all_precip = ma.zeros((len(files), 52, 39))
all_precip = np.zeros((len(files), 52, 39))
all_precip.fill(np.nan)
for idx, x in enumerate(files):
ds = Dataset(x, 'r')
precip = ds.variables['cdf_precip_dmean_tmean_abs'][:, :]
all_precip[idx, :, :] = precip
ds.close()
os.chdir('../../../..')
#dimensions of netCDF file
def altReadin(path):
my_file = Dataset(path)
print(my_file.file_format)
print("Dimensions: " + str(my_file.dimensions.keys()))
print(my_file.variables['rlon'])
content = MFDataset(path, False, 'rlon')
print(content.variables['cdf_precip_dmean_tmean_abs'][:])
print("Variables: "+ str(my_file.variables.keys()))
altReadin(FILE_PATH)
#####OUTPUT
NETCDF3_CLASSIC
Dimensions: [u'rlat', u'bound', u'rlon']
<type 'netCDF4._netCDF4.Variable'>
float32 rlon(rlon)
bounds: bounds_rlon
topology: circular
long_name: longitude in rotated pole grid
standard_name: grid_longitude
units: degrees
modulo: 360.0
axis: X
unlimited dimensions:
current shape = (39,)
filling off
[[-- -- -- ..., -- -- --]
[-- -- -- ..., 5.498641490936279 5.392685890197754 --]
[-- -- -- ..., 5.66285514831543 -- --]
...,
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]]
Variables: [u'rlat', u'bounds_rlat', u'rlon', u'bounds_rlon', u'lat', u'lon', u'cdf_precip_dmean_tmean_abs', u'rotated_pole', u'meaning_period', u'time', u'em_scen', u'percentile']
#Totalling 12 months of precipitation
#????
# and then converting it to a csv
precip_tot = precip
#Method 1 saves csv with grid shape preserved
np.savetxt("precip_fut1.csv", precip, delimiter=",")
#Method 2 csv as a long string
precip_tot.sum(axis=0).filled().tofile('precip_tot_fut.csv', sep=',')
#Method 3 netcdf>dataframe>csv (still preserves shape)
precip_tot = pd.DataFrame(precip_tot)
precip_tot.to_csv("precip.csv")
#sample of output of precip
>>> >>> [[-- -- -- ..., -- -- --]
[-- -- -- ..., 7.167891502380371 6.648772716522217 --]
[-- -- -- ..., 7.282683372497559 -- --]
...,
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]
[-- -- -- ..., -- -- --]]
print(precip_tot.head()
0 1 2 3 4 5 6 7 8 9 ... 29 30 31 32 33 34 35 \
0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN
36 37 38
0 NaN NaN NaN
1 7.167892 6.648773 NaN
2 7.282683 NaN NaN
3 7.517180 NaN NaN
4 NaN NaN NaN
[5 rows x 39 columns]
感谢您的帮助!
答案 0 :(得分:0)
考虑这些Dataframe,为了简洁而缩小尺寸。
示例数据:
lat(5,)[ 60.5 61.5 62.5 63.5 64.5]
lon(4,)[-0.2345 -1.2345 -2.2345 -3.2345]
preceip(5, 4)[[ nan nan nan nan]
[ nan nan 5.49864149 5.39268589]
[ nan nan 5.66285515 nan]
[ nan nan nan nan]
[ nan nan nan nan]]
您的数据:
lon = ds.variables['rlon'][:, :]
lat = ds.variables['rlat'][:, :]
precip = ds.variables['cdf_precip_dmean_tmean_abs'][:, :]
阅读precip array
,追加非空数据:
precip_list = []
precip_tot = 0
for r in range(len(lat)):
for c in range(len(lon)):
if precip[r,c] > 0:
precip_list.append((lat[r], lon[c], precip[r,c]))
precip_tot += precip[r,c]
precip_list.append(('', 'precip_tot:', precip_tot))
fieldnames = ['grid number', 'latitude','longitude', 'Total_precipitation']
print('{fn[0]}\t{fn[1]}\t{fn[2]}\t{fn[3]}'.format(fn=fieldnames))
for i, d in enumerate(precip_list[:-1]):
print('{:<10}\t{:>8.4f}\t{:>9.4f}\t{:10.3f}'.format(i, d[0], d[1], d[2]))
print('{}precip_tot:\t{:10.3f}'.format('\t'*6, precip_tot))
输出:
grid number latitude longitude Total_precipitation 0 61.5000 -2.2345 5.499 1 61.5000 -3.2345 5.393 2 62.5000 -2.2345 5.663 precip_tot: 16.554
使用Python测试:3.4.2