パンダのdatetime dtypes read_csv


126

複数の日時列を含む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()を使用して列を変換することはオプションではありません。どの列がdatetimeオブジェクトになるかわかりません。その情報は変更される可能性があり、私のdtypesリストを知らせるものからのものです。

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

回答:


272

機能しない理由

csvファイルには文字列、整数、浮動小数点数のみを含めることができるため、read_csvに設定する日時の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)

これはパンダが読むことになりますcol1し、col2彼らが最も可能性のある文字列として、(「2016年5月5日」など)と、文字列を読んだ後、各列のdate_parserは、その文字列に作用し、何でもその関数のリターンをお返しします。

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

このpandas.read_csv()関数は、次のキーワード引数あります。date_parser

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

GOTCHA警告

あなたはそれに関数の実行ではなく関数を与えなければならないので、これは正しいです

date_parser = pd.datetools.to_datetime

これは間違っています:

date_parser = pd.datetools.to_datetime()

Pandas 0.22アップデート

pd.datetools.to_datetime に移転しました date_parser = pd.to_datetime

ありがとう@stackoverYC


1
@Drake user3221055が実際にサイトに戻ったことはないと思います。それが問題です。プロファイルに「最後に見られたのは5月20日14時2分35

2
これは遅いソリューションです。:この代わりに参照してくださいstackoverflow.com/questions/29882573/...
user1761806

@ user1761806ねえ良い発見!私はもっ​​と良いものを作りました。stackoverflow.com/a/46183514/3730397
firelynx 2017

2
パンダでは、0.22.0 pandas.core.datetools.to_datetimeは推奨されていませんpd.datetools.to_datetime。代わりに使用してください。このように:date_parser = pd.to_datetime
stackoverYC 2018年

1
convertersどの列にどのコンバーターがあるかを指定できるパラメーターもあります。parse_datesは有用であり、不良データを処理しますが、テストして各値を推測するために遅くなりますgist.github.com/gjreda/7433f5f70299610d9b6b
Davos

31

あるparse_datesため、パラメータread_csvあなたが日付または日付時刻として処理する列の名前を定義することを可能にするには:

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

列の単一の文字列名を渡していたときにエラーが発生しましたが、単一の値のリストも渡す必要があることを理解しました。
TapanHP

15

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

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)

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

そして、実際には、おそらくパンダに日付をTimeStampsに解析してもらいたいので、次のようになります。

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

7

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)

3
これでも、結果のデータフレームのdtypeはpandas.datetimeではなくオブジェクトになります
firelynx

11
これが望ましい効果をもたらさないという事実は別として、それも機能しません:AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
Gabriel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.