1. ホーム
  2. python

[解決済み】Pandasでデータ(.datファイル)を読み込む

2022-02-18 21:36:19

質問内容

Pandasで以下のデータ(.datファイルから)を読み込むにはどうすればよいでしょうか。

TIME                      XGSM
2004 006 01 00 01 37 600  1
2004 006 01 00 02 32 800  5
2004 006 01 00 03 28 000  8
2004 006 01 00 04 23 200  11
2004 006 01 00 05 18 400  17

カラムセパレータは(最低でも)スペース2つ。

試してみた

df = pd.read_table("test.dat", sep="\s+", usecols=['TIME', 'XGSM'])
print df

しかし、次のように表示されます。

   TIME  XGSM
   2004     6
   2004     6
   2004     6
   2004     6
   2004     6

解決方法は?

パラメータusecolsにカラムの順番を指定することができます。

import pandas as pd
from pandas.compat import StringIO

temp=u"""TIME             XGSM
2004 006 01 00 01 37 600  1
2004 006 01 00 02 32 800  5
2004 006 01 00 03 28 000  8
2004 006 01 00 04 23 200  11
2004 006 01 00 05 18 400  17"""
#after testing replace StringIO(temp) to filename
df = pd.read_csv(StringIO(temp), 
                 sep="\s+", 
                 skiprows=1, 
                 usecols=[0,7], 
                 names=['TIME','XGSM'])

print (df)
   TIME  XGSM
0  2004     1
1  2004     5
2  2004     8
3  2004    11
4  2004    17

編集する

セパレータを使用することができます。 regex - 2以上のスペースを入れ、さらに engine='python' という警告が出るからです。

ParserWarning: c' エンジンは正規表現のセパレータをサポートしていないため、'python' エンジンにフォールバックします(セパレータ > 1 文字と '\s+' 以外のものは正規表現として解釈されます); engine='python' を指定すると、この警告を避けることができます。

import pandas as pd
from pandas.compat import StringIO

temp=u"""TIME              XGSM
2004 006 01 00 01 37 600   1
2004 006 01 00 02 32 800   5
2004 006 01 00 03 28 000   8
2004 006 01 00 04 23 200   11
2004 006 01 00 05 18 400   17"""
#after testing replace StringIO(temp) to filename
df = pd.read_csv(StringIO(temp), sep=r'\s{2,}', engine='python')

print (df)
                       TIME  XGSM
0  2004 006 01 00 01 37 600     1
1  2004 006 01 00 02 32 800     5
2  2004 006 01 00 03 28 000     8
3  2004 006 01 00 04 23 200    11
4  2004 006 01 00 05 18 400    17