当前位置: 首页 > 知识库问答 >
问题:

将掩码Numpy数组转换为csv文件

沈茂
2023-03-14

我在将netCDF文件(这是一个掩码numpy数组)转换为csv文件时遇到了问题。netcdf文件由12个单独的文件压缩而成,形成一个12 x 52 x 39的3D阵列,其中12对应于月份,52对应于纬度,29对应于经度。

更新:我想要的csv输出是4列,具有网格号(0-437)、纬度、经度和总降水量。例如:

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

阳兴朝
2023-03-14

考虑这些数据帧,为了简洁起见,维数被减少。

示例数据:

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'][:, :]

读取< code>precip数组,追加非空数据:

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

 类似资料:
  • 问题内容: 我在一个一维数组中有一个例子。它只会输出列。我的想法是使用2d数组选择行和列。这是我的代码: myfile.csv 输出: 名字蒂姆汤姆 问题答案: 我只是将split结果()添加到a中,如果您确实希望将其作为2d数组,则在事后将其转换。

  • 问题内容: 如何将数组转换为CSV文件? 这是我的数组: 问题答案: 我正在使用以下功能;它是对fputscsv注释中的man条目之一的改编。而且您可能想要展平该数组;不知道如果您传递一个多维的行会发生什么。

  • 问题内容: 注意: 这要求与通常的元组到数组的转换相反。 我必须将一个参数传递给(包装的c ++)函数作为嵌套元组。例如,以下作品 而以下 不 不幸的是,我想使用的参数是一个numpy数组。对于某些N,该阵列的尺寸始终为2xN,这可能会很大。 有没有简单的方法可以将其转换为元组?我知道我可以循环遍历,创建一个新的元组,但是如果numpy数组提供了一些不错的访问权限,我会更喜欢。 如果不可能如我所愿

  • 问题内容: 我正在尝试将代表黑白图像的2D Numpy数组转换为3通道OpenCV数组(即RGB图像)。 基于代码示例和文档,我正尝试通过Python执行此操作,例如: 但是,对CvtColor()的调用将引发以下cpp级异常: 我究竟做错了什么? 问题答案: 您的代码可以固定如下: 简短说明: 数据类型不受OpenCV的支持(它支持,,,,,,) 无法处理numpy数组,因此必须将两个参数都转换

  • 问题内容: 我想将图像转换为NumPy数组再转换为PySide QPixmap,因此可以显示它(在PySide UI中编辑:)。我已经找到了此工具:qimage2ndarray,但它仅适用于PyQt4。我试图对其进行更改以使其能够与PySide一起使用,但是我将不得不更改该工具的C部分,并且我没有使用C的经验。我该怎么做?或者有其他选择吗? 问题答案: 一种选择是仅使用PIL库。 您可以在http

  • 问题内容: 有没有办法将NumPy数组转储到CSV文件中?我有一个2D NumPy数组,需要以人类可读的格式转储它。 问题答案: 将数组保存到文本文件。