2017-09-28 3 views
0

xarrayを使って、パンダスDFからnetCDFファイルを作り出す方法を学ぶ。いくつかのチュートリアルとSOの質問Add 'constant' dimension to xarray DatasetAdd 'constant' dimension to xarray Datasetに続いていくつかの問題がまだありますが、Date_Time、latとlonを次元として取得できません。 ncダンプを実行すると、それらは正しくありません。パンダのDFにtxtファイルをインポートxarrayからパンダスのnetCDFへの書き込み - 次元の問題

最初のアプローチは、NetCDFファイルにはxr:

import pandas as pd 
import xarray 

#IMport Data from .dat file 
colnames1 = ['Date','Time','latitude','longitude','Status','depth'] 
df2 = pd.read_csv('test.txt',header=0,error_bad_lines=False, names = colnames1,delim_whitespace=True) 

# create xray Dataset from Pandas DataFrame 
xr = xarray.Dataset.from_dataframe(df2) 

# add variable attribute metadata 
xr['latitude'].attrs={'units':'degrees', 'long_name':'Latitude'} 
xr['longitude'].attrs={'units':'degrees', 'long_name':'Longitude'} 
xr['depth'].attrs={'units':'m', 'long_name':'depth'} 


# add global attribute metadata 
xr.attrs={'Conventions':'CF-1.6', 'title':'Data', 'summary':'Data generated'} 
#print xr 
print xr 
# save to netCDF 
xr.to_netcdf('test.nc') 

DF2 =

Date   Time grid_latitude grid_longitude Status depth                 
2017-09-05 13:01:59  -29.034083  31.068567  2.0 0.0 
2017-09-05 13:01:59  -29.039367  31.059150  2.0 0.0 
2017-09-05 13:01:59  -29.036650  31.059200  3.0 0.0 
2017-09-05 13:01:59  -29.036750  31.065417  7.0 100.0 
2017-09-05 13:01:59  -29.039317  31.056050  7.0 100.0 
2017-09-05 13:01:59  -29.034000  31.062367  3.0 0.0 
2017-09-05 13:01:59  -29.036517  31.049900  3.0 0.0 
2017-09-05 13:01:59  -29.031100  31.050000  3.0 0.0 

これは正常に動作しますが、次元が正しくありません(下記参照):

<xarray.Dataset> 
Dimensions: (index: 8) 
Coordinates: 
    * index  (index) int64 0 1 2 3 4 5 6 7 
Data variables: 
    Date  (index) object '2017-09-05' '2017-09-05' '2017-09-05' ... 
    Time  (index) object '13:01:59' '13:01:59' '13:01:59' '13:01:59' ... 
    latitude (index) float64 -29.03 -29.04 -29.04 -29.04 -29.04 -29.03 ... 
    longitude (index) float64 31.07 31.06 31.06 31.07 31.06 31.06 31.05 31.05 
    Status  (index) float64 2.0 2.0 3.0 7.0 7.0 3.0 3.0 3.0 
    depth  (index) float64 0.0 0.0 0.0 100.0 100.0 0.0 0.0 0.0 
Attributes: 
    title: Data 
    summary: Data generated 
    Conventions: CF-1.6 

DFインデックスとしてDateまたはマージされたDate_Timeを設定した場合、Date/Timのディメンション

<xarray.Dataset> 
Dimensions: (Date: 8) 
Coordinates: 
    * Date  (Date) object '2017-09-05' '2017-09-05' '2017-09-05' ... 
Data variables: 
    Time  (Date) object '13:01:59' '13:01:59' '13:01:59' '13:01:59' ... 
    latitude (Date) float64 -29.03 -29.04 -29.04 -29.04 -29.04 -29.03 ... 
    longitude (Date) float64 31.07 31.06 31.06 31.07 31.06 31.06 31.05 31.05 
    Status  (Date) float64 2.0 2.0 3.0 7.0 7.0 3.0 3.0 3.0 
    depth  (Date) float64 0.0 0.0 0.0 100.0 100.0 0.0 0.0 0.0 
Attributes: 
    title: Data 
    summary: Data generated 
    Conventions: CF-1.6 

しかし、私は日付時刻、緯度と経度でdf.indexを設定した場合、それが戻って空白(インデックス)に戻ります:eは罰金とディメンションとして見られています。 寸法を取得するためのポインタがありがとう。 netCDFモジュールを使用すると、lat = dataset.createDimension( 'lat'、73)の構文を使用してディメンションを作成できます。 SOの例add dimension to an xarray DataArrayも役に立ちません。たぶん私は何かを見逃している、またはそれは学習の私の制限です。私は、ncのダンプがこれに似た何かを生成するところまで行きたいと思います。

NetCDF dimension information: 
     Name: lat 
       size: 73 
       type: dtype('float32') 
       units: u'degrees_north' 
       actual_range: array([ 90., -90.], dtype=float32) 
       long_name: u'Latitude' 
       standard_name: u'latitude' 
       axis: u'Y' 
     Name: lon 
       size: 144 
       type: dtype('float32') 
       units: u'degrees_east' 
       long_name: u'Longitude' 
       actual_range: array([ 0. , 357.5], dtype=float32) 
       standard_name: u'longitude' 
       axis: u'X' 
     Name: time 
       size: 366 
       type: dtype('float64') 
       units: u'hours since 1-1-1 00:00:0.0' 
       long_name: u'Time' 
       actual_range: array([ 17628096., 17636856.]) 
       delta_t: u'0000-00-01 00:00:00' 
       standard_name: u'time' 
       axis: u'T' 
       avg_period: u'0000-00-01 00:00:00' 

Else私はDF列をnp配列に変換し、netCDFモジュールを使用できますか?事前に多くの感謝。 私はこのような何かをしようとするベンチャーをしましたが、私はそれが正しい道の上に疑う:

#add dimeensions 
#d = {} 
#d['time'] = ('time',df2.Time) 
#d['latitude'] = ('latitude',df2.latitude) 
#d['longitude'] = ('longitude', df2.longitude) 
#d['var'] = (['time','latitude','longitude','Depth'], xr) 
#xr = xray.Dataset(d) 
+0

は、あなたが私たちに何をしようとするのコードを表示することができますか? MCVEの開発に関するいくつかの指針については、こちらを参照してください。https://stackoverflow.com/help/mcve – jhamman

答えて

1

これは、に変換する前set_index()でDATAFRAMEにpandas.MultiIndexTimegrid_latitudegrid_longitudeを組み合わせることにより達成するのが最も簡単ですxarrayデータセット。例えば

# note that pandas.DataFrame's to_xarray() method is equivalent to 
# xarray.Dataset.from_dataframe() 
ds = df.set_index(['Time', 'grid_latitude', 'grid_longitude']).to_xarray() 
関連する問題