2012-09-04 14 views
5

我與格式幾個CSV文件:使用Python大熊貓與日期格式年,日,小時,閔解析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 
... 

(其中天,是天的年),我試圖讀取它們使用熊貓庫(似乎是一個夢幻般的lib到目前爲止)。

有一個內置函數來讀取熊貓的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」 屬性功能熊貓。但是這些文檔並沒有說明我怎麼也弄不清楚。 任何人都可以舉手的主題。

乾杯, 布魯諾

回答

11

爲了解析多列日,你需要告訴哪些列應該合併成一個單一的日期大熊貓,所以你需要說parse_dates=['Year','Day','Hour','Min','Sec']

您還需要定義自己的解析器,需要一個元素從您在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