2013-07-04 12 views
58

今日は、私は積極的に(例えば)データファイルパンダからデータを読みながら、値の種類を認識することが可能であるという事実に驚きました。それは、この方法で確認することができます例えばパンダは自動的に日付を認識できますか?

df = pandas.read_csv('test.dat', delimiter=r"\s+", names=['col1','col2','col3']) 

for i, r in df.iterrows(): 
    print type(r['col1']), type(r['col2']), type(r['col3']) 

特に整数、浮動小数点数および文字列が正しく認識されました。ただし、次の形式の日付を持つ列があります。2013-6-4。これらの日付は文字列として認識されました(Pythonの日付オブジェクトではありません)。パンダを認知された日付に "習う"方法はありますか?

答えて

138

通常、魔方陣で読むには、parse_dates=Trueまたはparse_dates=['column name']を追加する必要があります。しかし、手動で定義する必要がある奇妙なフォーマットが常にあります。そのような場合は、可能な限り最も柔軟な方法である日付パーサ関数を追加することもできます。

は、その後、あなたは文字列と列「日時」を持っていると仮定します。あなたも、単一のdatetime列に複数の列を組み合わせることができ

dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S') 

df = pd.read_csv(infile, parse_dates=['datetime'], date_parser=dateparse) 

この方法で、これは「日付」と「時間」をマージし列を単一の「datetime」列に置き換えます。

dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S') 

df = pd.read_csv(infile, parse_dates={'datetime': ['date', 'time']}, date_parser=dateparse) 
+1

私のために働かなかった、私は以下を得た:エラー: 'TypeError:strptime()引数は1浮動小数点ではなく、strでなければならない ' –

+2

私のデータフレームにはnanがあるので、このエラーが出ます。 –

+0

また、解析できないマテリアルやNaNや/ NsもNaTするアイテムを追加できますか?なぜなら、もしこのようなものがあれば、このパーサは完全に列全体をスキップするように見えるからです。 – Amir

10

pandas read_csvメソッドは、日付の解析に最適です。 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html

の完全なドキュメントは、あなたも異なる列で異なる日付の部分を持っており、パラメータを渡すことができます。日付の

parse_dates : boolean, list of ints or names, list of lists, or dict 
If True -> try parsing the index. If [1, 2, 3] -> try parsing columns 1, 2, 3 each as a 
separate date column. If [[1, 3]] -> combine columns 1 and 3 and parse as a single date 
column. {‘foo’ : [1, 3]} -> parse columns 1, 3 as date and call result ‘foo’ 

デフォルトのセンスは素晴らしい作品が、北アメリカの日付形式に偏っているように見えます。あなたが他の場所に住んでいると、ときに結果に巻き込まれることがあります。私が覚えている限り、2000年1月6日は、1月6日がアメリカで、1月が6月であることを意味します。 23/6/2000のような日付が使用されている場合は、それを振り回すほどスマートです。 YYYYMMDDの日付のバリエーションにとどまるのはおそらくもっと安全でしょう。パンダの開発者にお詫びしますが、最近私は地元の日付でそれをテストしていません。

date_parserパラメータを使用して、フォーマットを変換する関数を渡すことができます。

date_parser : function 
Function to use for converting a sequence of string columns to an array of datetime 
instances. The default uses dateutil.parser.parser to do the conversion. 
+0

私の答えを入力していたときに答えが返ってきました。私は役に立つかもしれない他のいくつかの洞察力を持っていたので、ここにとどまってください。 – Joop

+0

それは良い答えです。少しの冗長性は何の害もありません。 :) –

+1

あなたの答えを削除しないでください。他のいくつかの側面をカバーするか、または他の処方(言葉遣い)を持つことが有用かもしれない。 – Roman

10

おそらく@Rutgerが答えたので、パンダのインターフェースが変更されましたが、私が使用しているバージョン(0.15.2)で、date_parser機能は、日付のリストの代わりに、単一の値を受け取ります。この場合は、彼のコードはそうのように更新する必要があります

dateparse = lambda dates: [pd.datetime.strptime(d, '%Y-%m-%d %H:%M:%S') for d in dates] 

df = pd.read_csv(infile, parse_dates=['datetime'], date_parser=dateparse) 
3

はい - pandas.read_csvdocumentationに従って:

だから、

Note: A fast-path exists for iso8601-formatted dates.

あなたのcsvファイルはdatetimeという名前の列を持っている場合と日付がため2013-01-01T01:01のように見えますたとえば、これを実行するとパンダが作成されます(私はv0.19に入っています)。2)自動的に日付と時刻を拾う:あなたが明示的にparse_datesを渡す必要が

df = pd.read_csv('test.csv', parse_dates=['datetime'])

注意、それがないと動作しません。

を確認します。

If a column or index contains an unparseable date, the entire column or index will be returned unaltered as an object data type. For non-standard datetime parsing, use pd.to_datetime after pd.read_csv .

デモ:あなたは、列のデータ型がpandas.read_csv()のドキュメントで推奨されているようにあなたがpandas.to_datetime()を使用することができdatetime64[ns]

+0

質問を誤解していると思います。ユーザーは、文字列の形式に対してこのオプションを有効にできるかどうか不思議です。 –

+0

@AryaMcCarthyええと、彼は基本的に日付が正しく認識されることを望んでいるので、ソースデータをどのように変えてパンダが自然に認識できるのかを言及しています。ソースデータの形式を変更することはできません。 – Gaurav

+0

しかし、これは美しくて簡単な解決策です!共有ありがとう! :) –

0

で表示されるはずです

df.dtypes

>>> D = {'date': '2013-6-4'} 
>>> df = pd.DataFrame(D, index=[0]) 
>>> df 
     date 
0 2013-6-4 
>>> df.dtypes 
date object 
dtype: object 
>>> df['date'] = pd.to_datetime(df.date, format='%Y-%m-%d') 
>>> df 
     date 
0 2013-06-04 
>>> df.dtypes 
date datetime64[ns] 
dtype: object 
1

2つの列を1つのdatetime列にマージすると、列がdate_parser関数に個別に送信されるため、受け入れられた応答でエラー(pandasバージョン0.20.3)が生成されます。

次作品:

def dateparse(d,t): 
    dt = d + " " + t 
    return pd.datetime.strptime(dt, '%d/%m/%Y %H:%M:%S') 

df = pd.read_csv(infile, parse_dates={'datetime': ['date', 'time']}, date_parser=dateparse) 
0

DF = pd.read_csv( "/ホーム/ Manojさん/デスクトップ/ train_aWnotuB.csv"、parse_dates = [ 'のDateTime'])

特長=リスト(

+1

ようこそ。解決策に新しいものを追加しない限り、受け入れられた回答が存在する場合に新しい回答を追加することを控えてください。 – ext

関連する問題