web-dev-qa-db-ja.com

pandas read_csvの日時dtype

複数の日時列を含むcsvファイルを読んでいます。ファイルの読み取り時にデータ型を設定する必要がありますが、日時が問題のようです。例えば:

headers = ['col1', 'col2', 'col3', 'col4']
dtypes = ['datetime', 'datetime', 'str', 'float']
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

実行するとエラーが発生する場合:

TypeError:データ型「datetime」が理解できません

事実の後、pandas.to_datetime()を介して列を変換することは、どの列が日時オブジェクトになるかを知ることができないオプションではありません。その情報は変化する可能性があり、私のdtypesリストに通知するものからのものです。

あるいは、numpy.genfromtxtでcsvファイルをロードし、その関数でdtypesを設定してから、pandas.dataframeに変換しようとしましたが、データが文字化けします。どんな助けも大歓迎です!

85
user3221055

なぜ機能しないのか

Csvファイルには文字列、整数、および浮動小数点のみを含めることができるため、read_csvに設定するdatetime dtypeはありません。

Dtypeをdatetimeに設定すると、pandasがdatetimeをオブジェクトとして解釈します。つまり、文字列になります。

これを解決するパンダの方法

pandas.read_csv() 関数にはparse_datesというキーワード引数があります

これを使用すると、デフォルトのdate_parserdateutil.parser.parser)を使用して、文字列、浮動小数点数、または整数を日時にオンザフライで変換できます。

headers = ['col1', 'col2', 'col3', 'col4']
dtypes = {'col1': 'str', 'col2': 'str', 'col3': 'str', 'col4': 'float'}
parse_dates = ['col1', 'col2']
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes, parse_dates=parse_dates)

これにより、pandasがcol1およびcol2を文字列として読み取るようになります。これらは( "2016-05-05"など)であり、文字列を読み取った後、各列のdate_parserがそれに基づいて動作します文字列を返し、その関数が返すものを返します。

独自の日付解析関数の定義:

pandas.read_csv() 関数alsoにはdate_parserというキーワード引数があります

これをラムダ関数に設定すると、その特定の関数が日付の解析に使用されます。

ゴッチャ警告

関数の実行ではなく、関数を指定する必要があります。したがって、これはCorrectです。

date_parser = pd.datetools.to_datetime

これはincorrectです:

date_parser = pd.datetools.to_datetime()

パンダ0.22アップデート

pd.datetools.to_datetimedate_parser = pd.to_datetimeに再配置されました

ありがとう@stackoverYC

214
firelynx

文字列の代わりに実際の型を渡してみてください。

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime, datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

しかし、データをいじることなくこれを診断するのは本当に難しいでしょう。

そして、実際には、pandasが日付をTimeStampsに解析することを望むでしょう。

pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=True)
14
Paul H

Read_csvに渡すことができるparse_datesパラメータがあり、日付として処理する列の名前をリストできます。 OPの最適な方法は次のとおりです。

dateCols = ['col1', 'col2']
pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=dateCols)

現在のread_csvのドキュメント かなりおしゃれ...

10
mrjrdnthms

Dtypes = [datetime、...]オプションを使用してみましたが、

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime, datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

次のエラーが発生しました。

TypeError: data type not understood

私がしなければならなかった唯一の変更は、datetimeをdatetime.datetimeに置き換えることです。

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime.datetime, datetime.datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)
6
Jose Buraschi