3
\ begingroup美元

我已经创建了一个x, y netcdf文件和现在想添加额外的时间能量变量。这为每个网格单元能量时间价值。

我的脚本在Python中是这样的:

值= loadtxt (“countries.txt skiprows = 0) % = loadtxt国家数据(“energy.txt”, skiprows = 0) %的能量

energy.txt文件是:

(国家id)……51 52 54 55 56 59 60 62…[时间步1]…649年南南南1083 9979南13602…[时间步2]…5743 43444 6365 1283 9062 4026南南…(时间步n)…………………………

等(直到87648步),感兴趣的细胞是第一行:

cellsOfInt =数据(0:)

  • 我为一些细胞nan值以来没有值的时间步骤。
  • 每一行对应一个时间步长对感兴趣的细胞51,在第一次一步nan值,在第二次步骤中我们有5743等等,直到87648年。
  • 所有的细胞都感兴趣的国家。txt文件与感兴趣的细胞950 X 1000 id或南当没有价值。

我的代码:

y =数控。createDimension (" y ", 950) # y x =数控。createDimension (“x”, 1000) # x时间=数控。createDimension(“时间”,87648)#时间纬度=数控。createVariable (“y”、“f8”(“y”))经度=数控。createVariable (“x”、“f8”(“x”))时间= nc.createVariable(“时间”、“f8”(“时间”))国家=数控。createVariable(“国家”、“f8”(" y "、" x "));能量=数控。createVariable(“能源”、“f8”(“时间”、“y”、“x”), fill_value = -9999, chunksize = (950, 1000));时间。standard_name = '时间'时间。单位= '小时自2006-01-01 00:00:00.0。calendar='proleptic_gregorian' lats = np.arange(5497500,747500,-5000) #y lons = np.arange(2502500,7502500,5000) #x # Fill variables latitude[:] = lats longitude[:] = lons countries [:]=value

直到这里没问题我2 d国家但是它不给任何结果对能源:

xrange(0950):我的#行j xrange(0, 1000): #列在xrange n(0, 87648): #行米xrange(0,1): #如果数据列(1米)= =国家(i, j): #函件nc.variables数据(“能源”)[n] = [n m]

知道怎么解决这个问题我可以在country.netcdf文件时间维度与精力值在每个时间步?非常感谢! !

\ endgroup美元
3
  • 1
    \ begingroup美元 三个评论(我不熟悉python):(一)数组索引从0开始(1)在Python中,对吧?那么它应该如果数据[0,m] = =国家(i, j):因为你是感兴趣的第一行;(b)01(的m xrange (0,1):),但是它应该从0number_of_countries这的所有列能源是迭代。(c)的顺序nfor循环似乎是完全无效的。更好的是:米…:如果数据[1 m] = =…:n…:nc.variables…=…。或更换后一个for循环nc.variables[“能量”][:]=数据(:,m) \ endgroup美元
    - - - - - -daniel.heydebreck
    2017年10月22日在39
  • 1
    \ begingroup美元 看一看xarray,我认为这可以让你设置更加容易。 \ endgroup美元
    - - - - - -user2821
    2017年10月22日,在十一21
  • \ begingroup美元 我认为使用nco和/或其他工具将是一个更直接的方法创建和增加netcdf文件。例如netcdf厨房水槽linux.die.net/man/1/ncks。看到一个列表:unidata.ucar.edu/software/netcdf/software.html \ endgroup美元
    - - - - - -f.thorpe
    2017年11月22日在17:26

1回答1

1
\ begingroup美元

有两个问题(和一个优化)/上面的代码:

  1. 数组索引开始0(不1在Python中)。因此,它应该是如果数据[0,m] = =国家(i, j):因为你是感兴趣的第一行;
  2. 01 (的m xrange (0,1):),但是它应该从0number_of_countries所以所有列的能量迭代。
  3. 的顺序nfor循环似乎是完全无效的。更好的是:米…:如果数据[1 m] = =…:n…:nc.variables…= ....或更换后一个for循环nc.variables[“能量”][:,i, j] =数据(:,m)

这可以工作(请改善= >社区Wiki)但我不能测试它丢失的输入数据:

y =数控。createDimension (" y ", 950) # y x =数控。createDimension (“x”, 1000) # x时间=数控。createDimension(“时间”,87648)#时间纬度=数控。createVariable (“y”、“f8”(“y”))经度=数控。createVariable (“x”、“f8”(“x”))时间= nc.createVariable(“时间”、“f8”(“时间”))国家=数控。createVariable(“国家”、“f8”(" y "、" x "));能量=数控。createVariable(“能源”、“f8”(“时间”、“y”、“x”), fill_value = -9999, chunksize = (950, 1000));时间。standard_name = '时间'时间。单位= '小时自2006-01-01 00:00:00.0。calendar='proleptic_gregorian' lats = np.arange(5497500,747500,-5000) #y lons = np.arange(2502500,7502500,5000) #x # Fill variables latitude[:] = lats longitude[:] = lons countries [:]=value for i in xrange(0,950): # grid rows for j in xrange(0,1000): # grid columns for m in xrange(0,int(max(countries))): # countries if data[0,m] == countries[i,j]: #correspondance nc.variables["energy"][:,i,j]=data[1:87648,m]
\ endgroup美元

    你的答案

    通过点击“发布你的答案”,你同意我们服务条款,隐私政策饼干的政策

    不是你要找的答案?浏览其他问题标记问你自己的问题