将屏蔽的numpy数组转换为csv文件

时间:2017-06-01 17:25:15

标签: python arrays csv numpy netcdf

我无法将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]

感谢您的帮助!

1 个答案:

答案 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