2017-01-13 1 views
2

パッケージ 'savReaderWriter'のSavLoaderを使用してSAV-dataset(SPSS-dataset)をロードしました。生データはパンダのデータフレームとしてロードされ、メタ情報(変数ラベル、値ラベル、フォーマットなど)はmeta_dictという辞書としてロードされます。 SavWriterでロードされたデータセット/パンダのデータフレームを保存すると、完璧に動作します:SPSSIOError: 'variable'の形式が誤って指定されました(A'XXX)

array = dataframe.where(dataframe.notnull(), None).values 
with sav.SavWriter(path, var_names, var_types, **meta_kwargs) as writer: 
    writer.writerows(array) 

しかし、私はそれをデータフレーム内の変数の一つの弦を切っても同じ長さにmeta_dictでフォーマットを調整する場合これ以上は動作しません:

は、変数の文字列をカット:

meta_dictに変数のフォーマットを調整

dataframe[var] = dataframe[var].apply(lambda x: unicode(x)[:250])

meta_dict["formats"][var] = "A" + str(250)

これらの操作はどちらも機能します。しかし、SavWriterを使って調整したdataframeとmeta_dictを保存することはもうできません! 私は次のエラーを取得する:

私のコードに誤りだ

SPSSIOError: format for 'var' misspecified ('A250')

+0

なぜ 'データフレーム[VAR] = .applyデータフレーム[VAR](ラムダX:ユニコード(X)[:データフレーム[var] = .apply(lambda x:str(x)[:250]) '? – Abdou

+0

私はPython 2.7を使用しています。また、文字列にä、ü、öなどの記号もあります。私がユニコードを使用しない場合、私はascii/unicodeエラーを受け取ります。 – John

+0

「A250」は正しいフォーマットではないかもしれません。私はちょうど[savutilソースコード](https://github.com/angloc/savutil/blob/master/savdllwrapper.py)を見て、文字列のフォーマットとして "SPSS_FMT_A"がリストされています。代わりに 'meta_dict [" formats "] [var] =" SPSS_FMT_A "'を試してみてください。 – Abdou

答えて

2

SPSSデータ・ディクショナリは、あなたの問題のための2つの関連するattribues含まれています

  1. フォーマットを(すでに変更したもの)
  2. varTypes(あなたが不足している1)

フォーマットは、の意味である(たとえば、数値平方数、日付、時間または通貨として解釈することができます)。varTypesは、基になるデータ表現を文字列または数値のいずれかに区別するため、より基本的です。詳細はhereを参照してください。

savReaderWriterでは、両方のプロパティが(それぞれ独立して動作する必要があるとは思えますが)相互に一致する必要があります。したがって、あなただけそうのように、あなたのフォーマットに応じvarTypesを設定する必要があります。

meta_dict["formats"][var] = "A" + str(250) 
meta_dict["varTypes"][var] = 250 
+0

ありがとうございます! – John

関連する問題