2016-05-11 7 views
2

私はCSV形式の一連の月単位グリッドデータセットを用意しています。私はそれらを読んで、いくつかのディメンションを加えてから、netcdfに書きたいと思います。私は過去にxarray(xray)を使用して素晴らしい経験をしていましたので、もしこの仕事のために使うと思っていました。xarrayに 'constant'ディメンションを追加するデータセット

私は簡単のようなもので、2D DataArrayにそれらを取得することができます:

data = np.ones((360,720)) 
lats = np.arange(-89.75, 90, 0.5) * -1 
lngs = np.arange(-179.75, 180, 0.5) 
coords = {'lat': lats, 'lng':lngs} 
da = xr.DataArray(data, coords=coords) 

をしかし、私は(すべてのデータは同じ年/月からです)時間についての情報を伝えるだろう別の次元を追加しようとすると、物事は酸っぱくなる。

私はこのクラックする二つの方法試してみた:COORDSを更新して

data = np.ones((360,720)) 
lats = np.arange(-89.75, 90, 0.5) * -1 
lngs = np.arange(-179.75, 180, 0.5) 
coords = {'lat': lats, 'lng':lngs} 
data = data[:,:,np.newaxis] 

それから私は、上記と同じ手順に従います。のようなものは、1をmxnxために私の入力データを拡張)

1 3次元を含む

lats = np.arange(-89.75, 90, 0.5) * -1 
lngs = np.arange(-179.75, 180, 0.5) 
coords = {'lat': lats, 'lng':lngs} 
coords['time'] = pd.datetime(year, month, day)) 
da = xr.DataArray(data, coords=coords) 
da.to_dataset(name='variable_name') 

これはDataArrayを作成するための罰金です - しかし、私は(私はNetCDFファイルに書き込むことができます)データセットに変換しようとすると、私は約エラーが出る「とValueErrorを:オブジェクトは1次元でなければならない」座標

2)私が試みた2つ目のアプローチは、データ配列をデータフレームにキャストし、インデックスを[lat、lng]、[time]に設定してから、xr.Dataset.from_dataframe()でデータセットに戻ります。私はこれを試しました - しかし、私はプロセスを殺す前に20 +分かかる。

毎月の「時間」ディメンションでデータセットを取得する方法を知っている人はいますか?

+0

ありがとうございます。完全に再現可能な例を投稿することができれば、やりやすくすることができます。 – Maximilian

+0

@Maximilianはコピー/ペーストをサポートするためにいくつかの編集を行いました - 私は頻繁にここで質問しませんので、それ以上の編集/スタイルの変更をお手伝いしていただければ幸いです。 – badgley

+1

スティーブンは理想的な答えを出したので、私はそれを打ち負かそうとはしません。編集していただきありがとうございます...あなたが本当に将来のために別の改良をしたいのであれば、あなたのコードラインはブロックになる可能性があります(Stephanがそれらをどのようにしているかに注目してください) – Maximilian

答えて

6

あなたの最初の例はかなり近いです:座標の代わりに、

  1. 私は「時間」のために最初に渡している:

    lats = np.arange(-89.75, 90, 0.5) * -1 
    lngs = np.arange(-179.75, 180, 0.5) 
    coords = {'lat': lats, 'lng': lngs} 
    coords['time'] = [datetime.datetime(year, month, day)] 
    da = xr.DataArray(data, coords=coords, dims=['lat', 'lng', 'time']) 
    da.to_dataset(name='variable_name') 
    

    あなたは私のバージョンではいくつかの変更に気付くでしょうスカラー。 1D座標変数を取得するには、リストまたは1次元配列を渡す必要があります。これは、次元として「時間」を使用する場合に必要なものです。それはエラーValueError: Coordinate objects must be 1-dimensionalがあなたに伝えようとしていることです(途中で - そのエラーメッセージをもっと役立てる方法があれば、私はすべて耳にします)。

  2. DataArrayコンストラクタに引数dimsを提供しています。反復順序が保証されていないため、(順序付けられていない)ディクショナリを渡すことは少し危険です。
  3. pd.datetimeの代わりにdatetime.datetimeにも変更しました。後者は単に前者の別名です。

もう一つの賢明なアプローチは、このバージョンでは、参加にうまく一般化

lats = np.arange(-89.75, 90, 0.5) * -1 
lngs = np.arange(-179.75, 180, 0.5) 
coords = {'lat': lats, 'lng': lngs, 'time': datetime.datetime(year, month, day)} 
da = xr.DataArray(data, coords=coords, dims=['lat', 'lng']) 
expanded_da = xr.concat([da], 'time') 

、例えば、あなたがスカラーとして「時間」を追加した後、座標1つの項目のリストをconcatを使用することです数日間のデータをまとめて、DataArrayのリストを長くするだけです。私の経験では、ほとんどの場合、最初の余分なディメンションが必要な理由は、それに沿って連結できるようにすることです。長さ1のディメンションはそれ以外の場合はあまり役に立ちません。

+0

私は2番目のアプローチに行きました。私のlat/lngデータを360x720の配列に保つ柔軟性と、私がオリジナルの問題の定式化で自分のために作ったいくつかのステップを省略しました。 – badgley

関連する問題