对于提出一个已经多次全面解决的问题,我深表歉意.我的问题是,我试图复制粘贴,因为是SO帖子中的例子,但是没有为我工作.我的数据格式为"dd mm YYYY HH mm ss value value".我想把它读作一个pandas数据帧,第一列作为日期字符串.以下是我在SO帖子中尝试的示例:1.第一个示例数据
01 05 2013 00 00 00 26.4 16.5 02 05 2013 00 00 00 25.9 17.7 03 05 2013 00 00 00 26.6 17.4 ......
添加HH mm ss的零只是为了完全符合示例.
其次是进口包裹
从datetime import datetime导入pandas作为pd import os来自cStringIO import StringIO
fname = os.path.expanduser('./ temps0.txt')
现在我尝试了三个例子
a)来自SO帖子:
使用python中的pandas,将年月日和小时的日期分解在单独的列中
def dt_parse(date_string):dt = pd.datetime.strptime(date_string,'%d%m%Y')return dt df = pd.read_csv(fname,header = None,index_col ='datetime',parse_dates = {'datetime ':[0,1,2,4,5,6]},date_parser = lambda x:pd.datetime.strptime(x,'%d%m%Y'))date_parser = dt_pasre)
这是错误的一部分
File "/home/zmumba/anaconda/lib/python2.7/site-packages/pandas/io/parsers.py", line 1763, in _try_convert_dates colnames.append(str(columns[c])) IndexError: list index out of range
b)另一个尝试,从SO帖子:
/sf/ask/17360801/ parse = lambda x: datetime.strptime(x, '%d%m%Y') pd.read_table("./temps0.txt", parse_dates = [['DD MM YYYY HH mm ss']], index_col = 0, date_parser=parse)
这是错误的一部分
File "/home/zmumba/anaconda/lib/python2.7/site-packages/pandas/io/parsers.py", line 1009, in _set self._reader.set_noconvert(names.index(x)) ValueError: 'DD MM YYYY HH mm ss' is not in list
c)另一个尝试,从SO帖子:
/sf/ask/17360801/?lq=1 def date_parser(ss): day, month, year, hour, min, sec = ss.split() return pd.Timestamp('20%s-%s-%s %s:%s:%s' % (year, month, day, hour, min, sec)) df = pd.read_csv('temps0.txt', header=None, sep='\s+\s', parse_dates=[[0]], date_parser=date_parser)
这是错误的一部分
File "", line 2, in date_parser ValueError: too many values to unpack
请原谅我的无知,因为我主要是通过SO帖子来学习(官方文档完全缺乏示例,以便清晰).
在Chang的回答中,他使用了一个解析器,这是你需要调整以匹配日期字符串的日期格式:
import datetime parse = lambda x: datetime.strptime(x, '%d %m %Y %H %M %S')
您还需要调整列名称,在该示例中类似于格式,这有点令人困惑.这里我们没有列名,所以我们可以使用数字(对于列的位置,并告诉read_csv使用header = None):
from StringIO import StringIO csv = '''01 05 2013 00 00 00,26.4,16.5 02 05 2013 00 00 00,25.9,17.7 03 05 2013 00 00 00,26.6,17.4'''
注意:我们使用header = None,因为没有列名.
df = pd.read_csv(StringIO(csv), parse_dates=[0], index_col=0, date_parser=parse, header=None) In [11]: df Out[11]: 1 2 0 2013-05-01 26.4 16.5 2013-05-02 25.9 17.7 2013-05-03 26.6 17.4
如果您的数据由多个空格(两个以上)而不是逗号分隔,则使用sep参数:
csv = '''01 05 2013 00 00 00 26.4 16.5 02 05 2013 00 00 00 25.9 17.7 03 05 2013 00 00 00 26.6 17.4''' In [21]: pd.read_csv(StringIO(csv), parse_dates = [0], index_col = 0, date_parser=parse, header=None, sep='\s\s+') Out[21]: 1 2 0 2013-05-01 26.4 16.5 2013-05-02 25.9 17.7 2013-05-03 26.6 17.4
注意:io文档有很多细节,有很多例子.