3.
\ begingroup美元

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

我的Python脚本是这样的:

Value = loadtxt(" nations .txt",skiprows=0) % countries data = loadtxt("energy.txt",skiprows=0) % energy

energy.txt文件是这样的:

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

等等(直到87648步),其中感兴趣的单元格是第一行:

cellsOfInt =数据(0:)

  • 对于一些单元格,我有nan值,因为这些时间步长没有值。
  • 每一行对应一个时间步骤,所以对于51单元格,在第一个时间步骤中我们有nan值,在第二个时间步骤中我们有5743,直到87648。
  • 所有感兴趣的单元格都在nations .txt文件中,该文件是950 X 1000,当没有值时,感兴趣的单元格id或nan。

我的代码:

Y = nc。createDimension("y", 950) #y x = nc。createDimension("x", 1000) #x time = nc。createDimension("time", 87648) #time纬度=nc。creatvariable ("y", "f8", ("y",))经度=nc。createVariable(“x”、“f8”(“x”))时间= nc.createVariable(“时间”、“f8”(“时间”))国家=数控。creatvariable("国家","f8", ("y", "x"));能量= nc。creatvariable ("energy", "f8", ("time", "y", "x"), fill_value=-9999, chunksizes=(1,950, 1000));时间。standard_name = '时间'时间。单位='hours since 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

直到这里工作正常,我有我的2d国家,但它没有给出任何能量的结果:

如果I在xrange(0,950): #rows For j在xrange(0,1000): #columns For n在xrange(0,87648): #rows For m在xrange(0,1): #columns if data[1,m] == nations [I,j]: #correspondance nc.variables["energy"][n]=data[n,m]

有什么想法如何解决这个问题,这样我就可以在country.netcdf文件时间维度与能量值在每个时间步骤?非常感谢!

\ endgroup美元
3.
  • 1
    \ begingroup美元 三条评论(我不熟悉python):(一)在Python中数组索引以0(不是1)开始,对吗?那么它应该是如果data[0,m] == nations [i,j]:因为你对第一行感兴趣;(b)01对于m在xrange(0,1)中的值:),但它应该从0number_of_countries所有的列能源是迭代。(c)顺序n而且For循环似乎非常无效。更好的做法是:对我来说……: if data[1,m] ==…: for n in…: nc.variables…=….或替换后面的循环为nc.variables[“能量”][:]=数据(:,m) \ endgroup美元
    - - - - - -daniel.heydebreck
    2017年10月22日8:39
  • 1
    \ begingroup美元 看一看xarray我想这会让你的设置更容易。 \ endgroup美元
    - - - - - -user2821
    2017年10月22日11: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)。因此,它应该是如果data[0,m] == nations [i,j]:因为你对第一行感兴趣;
  2. 0至1 (对于m在xrange(0,1)中的值:),但它应该从0number_of_countries所以能量的所有列都是迭代的。
  3. 顺序n而且For循环似乎非常无效。更好的做法是:对我来说……: if data[1,m] ==…: for n in…: nc.variables…=…或替换后面的循环为nc.variables[“能量”][:,i, j] =数据(:,m)

这可以工作(请改进=>社区Wiki),但由于缺少输入数据,我无法测试它:

Y = nc。createDimension("y", 950) #y x = nc。createDimension("x", 1000) #x time = nc。createDimension("time", 87648) #time纬度=nc。creatvariable ("y", "f8", ("y",))经度=nc。createVariable(“x”、“f8”(“x”))时间= nc.createVariable(“时间”、“f8”(“时间”))国家=数控。creatvariable("国家","f8", ("y", "x"));能量= nc。creatvariable ("energy", "f8", ("time", "y", "x"), fill_value=-9999, chunksizes=(1,950, 1000));时间。standard_name = '时间'时间。单位='hours since 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美元

    你的答案

    点击“张贴您的答案”,即表示您同意我们的服务条款隐私政策而且饼干的政策

    这不是你想要的答案?浏览带标签的其他问题问自己的问题