ホーム>source

まず、謝罪しますが、コードを使用してこのエラーを再現することはできません。データとエラーのスクリーンショットを使用して、可能な限り最善の方法で説明します。

「Year」と「Season」でインデックス付けされた大きなデータフレームがあり、緯度、経度、および降雨量の値は次のようになります。

これは、 'Winter'、 'Spring'、 'Summer'、 'Autumn'の年次シーケンス(シーズン列の番号1:4)を尊重するように編成されています-Xarray Dataset への変換後もこのシーケンスを維持する必要があります  も。しかし、私が Dataset に直接変換しようとすると :

future = future.to_xarray()

次のエラーが表示されます。

したがって、一意の識別子でインデックスを再作成する必要があることは明らかです。latとlonのみを使用しようとしましたが、同じエラーが発生します(重複があるため)。インデックスをリセットしてからインデックスを再作成し、lat、lon、およびtimeを使用します  そのようです:

future = future.reset_index()
future.head()

future.set_index(['latitude', 'longitude', 'time'], inplace=True)
future.head()

を可能にします

future = future.to_xarray()

動作するコード:

問題は、これによりその年次シーケンスが失われたことです。データセットのSeason変数から、 '1' '1' '1' で始まることがわかります。  年の最初の3か月間、その後 '3','3','3' にジャンプします  冬から夏に行き、春をスキップすることを意味します。

これは、データフレームのインデックスを再作成した後の場合のみですが、インデックスを再作成せずにデータセットに変換することはできません。これを修正する方法はありますか?

これが明確であり、エラーが誰かが助けてくれるほど十分に説明されていることを願っています!

編集: ここでの問題は、日付順にインデックスを付け、日付を自動的に時間順に並べる(たとえば、1952は1951に続くなど)ことですが、これは望ましくありません。最初のデータフレーム(季節ごとに編成され、しかし、1955年に春が続き、2000年に夏が続き、1976年に秋になる可能性があります)-このシーケンスを保持する必要があります。

編集2:

そのため、「Year」をインデックスとして設定するか、単にインデックスをジェネリックのままにすると、データセットは次のようになります しかし、lat/lonを関連付けるにはtg変数が必要なので、データセットは次のようになります。

<xarray.Dataset>
Dimensions:    (Year: 190080)
Coordinates:
  * Year       (Year) int64 1970 1970 1970 1970 1970 1970 1970 1970 1970 ...
Data variables:
    Season     (Year) object '1' '1' '2' '2' '2' '3' '3' '3' '4' '4' '4' '1' ...
    latitude   (Year) float64 51.12 51.12 51.12 51.12 51.12 51.12 51.12 ...
    longitude  (Year) float64 -10.88 -10.88 -10.88 -10.88 -10.88 -10.88 ...
    seasdif    (Year) float32 -0.79192877 -0.79192877 -0.55932236 ...
    tg         (Year, latitude, longitude) float32 nan nan nan nan nan nan nan nan nan nan nan ...
    time       (Year) datetime64[ns] 1970-01-31 1970-02-28 1970-03-31 ...

あなたの答え
  • 解決した方法 # 1

    これがうまくいくかどうか教えてください。余分なインデックス列を追加し、それを使用して最後に並べ替えました。

    import pandas as pd
    import xarray as xr
    import numpy as np
    df = pd.DataFrame({'Year':[1951,1951,1951,1951],'Season':[1,1,1,3],'lat': 
    [51,51,51,51],'long':[10.8,10.8,10.6,10.6],'time':['1950-12-31','1951-01-31','1951- 
    02-28','1950-12-31']})
    
    

    インデックスを個別の列「Order」として作成し、set_indexとともに使用しました。これは、インデックスまたは1-D列のみをソートでき、3つの座標があったという事実によるものです。

    df.reset_index(level=0, inplace=True)
    df = df.rename(columns={'index': 'Order'})
    df['time'] = pd.to_datetime(df['time'])
    df.set_index(['lat', 'long', 'time','Order'], inplace=True)
    df.head()
    df = df.to_xarray()
    
    

    これは順序を保持し、tgに関連付けられたlat、lon、timeを持っている必要があります(ただし、dfにはありません)。

    df2 = df
    df2.sortby('Order')
    
    

    「注文」列を削除することもできますが、注文が変更されるかどうかはわかりません(私の注文は変更されません)。

    df2.drop('Order')
    
    

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ formatting - jq json cliを使用して数値を3桁ごとの区切り記号でフォーマットする