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美元

    你的答案

    通过点击“发布你的答案”,你同意我们服务条款并承认您已阅读并理解我们的隐私政策的行为准则

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