簡體   English   中英

如何在Python中使用xarray將多個netCDF文件中的數據連接起來?

[英]How to join data from multiple netCDF files with xarray in Python?

我正在嘗試用Python中的xarray打開多個netCDF文件。 文件具有相同形狀的數據,我想加入它們,創建一個新的維度。

我試圖為xarray.open_mfdataset()使用concat_dim參數,但它不能按預期工作。 下面給出一個例子,它打開兩個文件,溫度數據為124次,241個緯度和480個經度:

DS = xr.open_mfdataset( 'eraINTERIM_t2m_*.nc', concat_dim='cases' )
da_t2m = DS.t2m

print( da_t2m )

使用此代碼,我希望結果數據數組的形狀類似(例如:2,時間:124,緯度:241,經度:480)。 然而,它的形狀是(情況:2,時間:248,緯度:241,經度:480)。 它創建了一個新維度,但也總結了最左邊的維度:兩個數據集的“時間”維度。 我想知道這是'xarray.open_mfdateset'中的錯誤還是預期的行為,因為'time'維度對於兩個數據集都是無限的。

有沒有辦法直接使用xarray從這些文件加入數據並獲得上述預期的回報?

謝謝。

馬特烏斯

從我的評論中擴展我會試試這個:

def preproc(ds):
    ds = ds.assign({'stime': (['time'], ds.time)}).drop('time').rename({'time': 'ntime'})
    # we might need to tweak this a bit further, depending on the actual data layout
    return ds

DS = xr.open_mfdataset( 'eraINTERIM_t2m_*.nc', concat_dim='cases', preprocess=preproc)

這里的好處是,您在重命名原始維度( time - > ntime )時將原始時間坐標保持在stime

如果一切正常,你應該得到的尺寸為( casesntimelatitudelongitude )。

免責聲明:我在循環中做了類似的最終連接(效果非常好),但沒有測試preprocess方法。

如果時間不同,結果才有意義。

為了簡化它,暫時忘掉lat-lon維度,並想象你有兩個文件只是2倍的數據。 第一個數據的時間步長為1,2,第二個文件的時間步長為3和4.您無法創建時間維度僅為2個時間點的組合數據集; 時間維度變量必須具有1,2,3,4的時間。 所以如果你說你想要一個新的維度“案例”,那么數據然后組合成一個二維數組,看起來像這樣:

times: 1,2,3,4

cases: 1,2

data: 
               time
          1    2    3    4
cases 1:  x1   x2 
      2:            x3   x4

可以想象netcdf文件是等效的,時間維度必須跨越兩個文件中存在的值范圍。 你可以組合兩個文件並得到(例如:2,時間:124,緯度:241,經度:480)的唯一方法是,如果兩個文件具有相同的時間,lat和lon值,即指向完全相同的區域時間 - 緯度 - 空間。

ps:對於這個問題有些偏離主題,但是如果你剛剛開始一個新的分析,為什么不轉而使用更高分辨率的新一代ERA-5再分析,現在可以追溯到1979年(並最終將擴展)您可以從這里使用python api腳本將其直接下載到桌面:

https://cds.climate.copernicus.eu/cdsapp#!/search?type=dataset

謝謝@AdrianTompkins和@jhamman。 在您的評論之后,我意識到,由於不同的時間段,我真的無法得到我想要的東西,使用xarray。

我創建這樣的數組的主要目的是在一個ND陣列中獲取不同事件的所有數據,並且具有相同的持續時間。 因此,我可以很容易地獲得,例如,每個時間(小時,天等)的所有事件的復合字段。

我正在努力做與NCL一樣的事情。 請參閱下面的NCL代碼,該代碼對於相同的數據按預期工作(對我來說):

f = addfiles( (/"eraINTERIM_t2m_201812.nc", "eraINTERIM_t2m_201901.nc"/), "r" )
ListSetType( f, "join" )
temp = f[:]->t2m
printVarSummary( temp )

最終結果是一個包含4維的數組,新的數組自動命名為ncl_join

但是,NCL不尊重時間軸,連接數組並為結果時間軸提供第一個文件的坐標。 所以,時間軸變得無用。

但是,對於@AdrianTompkins來說,時間段也不同,xarray也不能像這樣加入數據。 因此,要創建這樣的數組,在Python中使用xarray,我認為唯一的方法是從數組中刪除時間坐標。 因此,時間維度只有整數索引。

xarray給出的數組就像@AdrianThompkins在他的小例子中所說的那樣。 由於它保留了所有合並數據的時間坐標,我認為與NCL相比,xarray解決方案是正確的。 但是,現在我認為復合材料的計算(得到上面給出的相同例子)不會像NCL那樣容易地完成。

在一個小測試中,我使用xarray從合並數組中打印兩個值

print( da_t2m[ 0, 0, 0, 0 ].values )
print( da_t2m[ 1, 0, 0, 0 ].values )

結果如何

252.11412
nan

對於第二種情況,第一次沒有數據,正如預期的那樣。

更新 :所有答案都幫助我更好地理解這個問題,所以我不得不在這里添加更新,也感謝@kmuehlbauer的回答,表明他的代碼給出了預期的數組。

再次,謝謝大家的幫助!

馬特烏斯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM