使用python pandas解析带有日期的CSV,格式为年、日、时、分、秒
我有几个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,更好的是,该函
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中放置一个空格,它将非常有效。很挑剔,但很管用。非常感谢。