2016-09-02 9 views
0

Dtype検出についてのPandas DataFrameの動作にはかなり問題があります。python pandas dtypesの検出

私は 'read_sql_query'を使用してデータベースからデータを取得してDataFrameを構築し、それをcsvファイルにダンプします。

私は変換する必要はありません。ただ、形式のcsvファイルと変更日付フィールドにそれをダンプ:'%D /%M /%Y'

をしかし:

self.dataframe.to_csv(self.fic, 
        index=False, 
        header=False, 
        sep='|', 
        mode='a', 
        encoding='utf-8', 
        line_terminator='\n', 
        date_format='%d/%m/%Y 
        ) 

は、いくつかの日付フィールドの書式を設定/ transformeする欠場だろう。 ..

私はそれを別の方法で実行しようとしました:

l = list(self.dataframe.select_dtypes(include=['datetime64']).columns) 
for i in l: 
    self.dataframe[i] = self.dataframe[i].dt.strftime('%d/%m/%Y') 

を私は満足することを約あったが、いくつかのより多くのテストが変な挙動を示した:

私のSQL要求は2つだけnupletsを選択した場合:

requete = 'select * from DOMMAGE_INTERET where doi_id in (176433, 181564)' 

すべては、どんな整形CSVまたはデータフレームで動作します。適切

それは、検出した日付フィールド:

df.dtypes 
doi_id       int64 
aff_id       int64 
pdo_id       int64 
doi_date_decision  datetime64[ns] 
doi_date_mod   datetime64[ns] 
doi_montant     float64 
doi_reste_a_payer    object 
doi_appliquer_taux    int64 
doi_date_update  datetime64[ns] 
afg_id       int64 
dtype: object 

しかし、異なる選択を使用している場合:

requete = 'select * from DOMMAGE_INTERET where rownum < 100' 

それは再び欠場。

doi_id       int64 
aff_id       int64 
pdo_id       int64 
doi_date_decision    object 
doi_date_mod   datetime64[ns] 
doi_montant     float64 
doi_reste_a_payer    object 
doi_appliquer_taux    int64 
doi_date_update  datetime64[ns] 
afg_id       int64 
dtype: object 

あなたが見ることができるように:そして実際に、種類が異なって検出されたフィールド「doi_date_decision」タイプは、要求選択の依存を変えるんが、もちろん、これは、同じデータセットです!

奇妙なのですか?

この現象についての説明はありますか?

答えて

2

指定したすべての日付フィールドを変換しませんあなたのto-csv操作理由として、すべてのdatetime列がdaとして読み込まれるわけではありません現在のデータフレームに文字列(オブジェクト dtype)として表示されます。これは、Python、SAS、Stata、R、Excelなどのインポートされたシステムとして外部ソースから読み込むことの残念な副作用です。明示的に定義されていない限り、最初の数行で列を定義しようとします。

幸いにも、パンダのread_sql_query()parse_datesのパラメータを維持しています。ただto_csvにし、前に読んだ後pd.to_datetime()に変換し、

また
df = read_sql_query('select * from DOMMAGE_INTERET where rownum < 100', engine, 
        parse_dates = ['doi_date_decision', 'doi_date_mod', 'doi_date_update']) 

:だから、この引数がリストや辞書を取るなどの操作中に、読み取り時の日付を定義することを検討

df['doi_date_decision'] = pd.to_datetime(df['doi_date_decision']) 

そしてRDMSが維持最も日時はYYYY-MM-DD HH:MM:SSの形式で、パンダの形式に合わせます。

1

いくつかのデータサンプルがないと問題を詳しく調べることは困難です。あなたは異なるMDY規則を持っている日時

  • としてパンダは自動的に列を解釈停止しNULL値が含まれているあなたは、あなたの第二の場合には選択した行の

    • 一部:しかし、あなたはおそらく2例のいずれかに直面しています他の人ではない、あなたはDMYに手動で変換するまでの文字列として保持されている間、あなたのデータベースと、いくつかの日付の月の第十三より低いが、日付として解析され
  • +0

    特にデータセットがデータベースにある場合は、データセットなしでこの問題を理解することは難しいです。 – stockersky

    +0

    'where in()'選択を使用してクエリで収集された2つの行は、 'numrow <100'の選択を使用して2番目のクエリに含まれます。そして、はい、1つはNULL値を持っています。データベース上で直接、書式設定はすべてのフィールドでまったく同じです。 – stockersky

    +0

    列がNull値で始まる場合、Pandasはこの列dtypeを読み取って 'オブジェクト'としてマークできませんか? – stockersky

    0

    BoudとParfaitに感謝します。彼らの答えは正しい:

    私のすべてのテストでは、日付フィールドがないとDタイプの検出に失敗する可能性があることが示されています。

    read_sql_query()には、日付型のフィールドを定義するパラメータがあります。私はこの問題を解決すると思う。

    悲しいことに、今から私は100のテーブルを処理するために完全な汎用処理を使用しています。'read_sql_query'パラメータ 'parse_dates'を使用することは、(各テーブルを記述するjsonファイルのような)メタデータ定義の先行作業を行うことを意味します。

    実は、私はまた、整数の列にNaNのフィールドがあるとき、私は、CSVフラットファイルを読み込むだろう場合は、私はそのデータ型はに難しいことができます理解することができ

    ...浮くように変更されていることが判明しましたデータベースから(read_sql_query)検出... Pandasは依存関係としてSqlAlchelmyを持っています。また、SqlAlchemy(および下位レベルのPythonデータベースドライバ(cx_Oracle、DB API))も、データ型を検出するためのリフレクションメカニズムを備えています。パンダは、これらのメタデータを使ってデータ型の整合性を保っていた可能性があります。