2012-09-04 15 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