、秒

2012-09-04 1 views
5

私は形式にはいくつかのCSVファイルを持っている:、秒

Year,Day,Hour,Min,Sec.,P1'S1 
2003, 1, 0, 0,12.22, 0.541 
2003, 1, 1, 0,20.69, 0.708 
2003, 1, 2, 0, 4.95, 0.520 
2003, 1, 3, 0,13.42, 0.539 
... 

(、の日どこです年)、私はパンダのライブラリを使ってそれらを読むようにしようとしています。

パンダでCSVを読み込む機能が組み込まれており、その機能では日付型の列がチェックされていると考えられます。それを自動的にインデックスとして使用しています(これは私がやっていることに完全に合っています)。

問題は、このフォーマットの日付データでは動作しません。

私が試した:

data = pd.read_csv("csvFile.csv", index_col=[0, 1], , index_col=[0, 1, 2, 3, 4] parse_dates=True) 

しかしそれだけで正しく年を取得する:

In [36]: data.index 
Out[36]: 
MultiIndex 
[(<Timestamp: 2003-09-04 00:00:00>, 1, 0, 0, 12.22) 
(<Timestamp: 2003-09-04 00:00:00>, 1, 1, 0, 20.69) 
(<Timestamp: 2003-09-04 00:00:00>, 1, 2, 0, 4.95) ..., 
(<Timestamp: 2003-09-04 00:00:00>, 365, 21, 0, 3.77) 
(<Timestamp: 2003-09-04 00:00:00>, 365, 22, 0, 14.6) 
(<Timestamp: 2003-09-04 00:00:00>, 365, 23, 0, 13.36)] 

ドキュメントから、私はあなたがread_csvに"date_parser" 属性を指定することができることを確認パンダの機能。しかし、ドキュメンテーションはどのように表示されていないと私はそれを把握することができません。 被験者に手を差し伸べることのできる経験がある人。あなたはあなたがまた必要parse_dates=['Year','Day','Hour','Min','Sec']

を言う必要があるので、

乾杯、 ブルーノ

答えて

11

複数列の日付を解析するためには、あなたは、列が単一の日付に結合されなければならないパンダを伝える必要がありますあなたはparse_datesで指定された各列から要素を取り、独自のパーサーを定義する:

In [1]: import pandas as pd 

In [2]: from datetime import datetime, timedelta 

In [3]: from cStringIO import StringIO 

In [4]: data = """\ 
Year,Day,Hour,Min,Sec.,P1'S1 
2003, 1, 0, 0,12.22, 0.541 
2003, 1, 1, 0,20.69, 0.708 
2003, 1, 2, 0, 4.95, 0.520 
2003, 1, 3, 0,13.42, 0.539 
""" 

In [5]: def parse(yr, doy, hr, min, sec): 
    yr, doy, hr, min = [int(x) for x in [yr, doy, hr, min]] 
    sec = float(sec) 
    mu_sec = int((sec - int(sec)) * 1e6) 
    sec = int(sec) 
    dt = datetime(yr - 1, 12, 31) 
    delta = timedelta(days=doy, hours=hr, minutes=min, seconds=sec, 
         microseconds=mu_sec) 
    return dt + delta 
    ...: 

In [6]: pd.read_csv(StringIO(data), parse_dates={'datetime':  
      ['Year','Day','Hour','Min','Sec.']}, 
      date_parser=parse, index_col='datetime') 
Out[6]: 
          P1'S1 
datetime       
2003-01-01 00:00:12.220000 0.541 
2003-01-01 01:00:20.690000 0.708 
2003-01-01 02:00:04.950000 0.520 
2003-01-01 03:00:13.419999 0.539 
+0

を私がチェックし、問題は、ファイルがちょうど年の値のように「年」ヘッダ(の前にスペースを持っているということですそれ以下)。 'Year'の前にread_csvのスペースを入れて 'Year'にすると、完璧に動作します。非常にうんざりですが、動作します。 ありがとうございました! – jbssm