使用python pandas解析带有日期的CSV,格式为年、日、时、分、秒

使用python pandas解析带有日期的CSV,格式为年、日、时、分、秒,python,pandas,python-dateutil,Python,Pandas,Python Dateutil,我有几个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 ... (where day,是一年中的一天)我正在尝试使用熊猫图书馆(到目前为止似乎是一个很棒的图书馆)阅读它们 有一个内置函数可以读取pandas中的CSV,更好的是,该函

我有几个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
...
(where day,是一年中的一天)我正在尝试使用熊猫图书馆(到目前为止似乎是一个很棒的图书馆)阅读它们

有一个内置函数可以读取pandas中的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)]
[36]中的
:data.index
出[36]:
多索引
[(, 1, 0, 0, 12.22)
(, 1, 1, 0, 20.69)
(, 1, 2, 0, 4.95) ...,
(, 365, 21, 0, 3.77)
(, 365, 22, 0, 14.6)
(, 365, 23, 0, 13.36)]
从文档中,我看到您可以在pandas的read\u csv函数中指定“date\u parser”属性。但是文档没有显示如何进行,我也无法理解。 任何有这方面经验的人都可以帮忙

干杯,
Bruno

为了解析多列日期,你需要告诉pandas哪些列应该组合成一个日期,所以你需要说
parse_dates=['Year','Day','Hour','Min','Sec']

您还需要定义自己的解析器,该解析器从
parse\u 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

我检查过了,问题是文件在“Year”头之前有一个空格(就像下面的Year值一样)。如果在“年”变为“年”之前,我在read_csv中放置一个空格,它将非常有效。很挑剔,但很管用。非常感谢。