我真诚地道歉,要求提出一个已经多次全面解决的问题。我的问题是,我试图复制粘贴,因为是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导入日期时间 将pandas导入为pd 进口口 来自cStringIO import StringIO
fname = os.path.expanduser('./ temps0.txt')
现在我尝试了三个例子
A) 来自SO帖子:
Parse dates when year month day and hour are in separate columns using pandas in python
def dt_parse(date_string): dt = pd.datetime.strptime(date_string,'%d%m%Y') 返回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帖子:
https://stackoverflow.com/questions/11615504/parse-dates-when-yyyymmdd-and-hh-are-in-separate-columns-using-pandas-in-python
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帖子:
https://stackoverflow.com/questions/17301589/parsing-dd-mm-yy-hh-mm-ss-columns-from-txt-file-using-pythons-pandas?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 "<stdin>", line 2, in date_parser
ValueError: too many values to unpack
请原谅我的无知,因为我主要是通过SO帖子来学习(为了清楚起见,官方文档完全缺乏示例)。
答案 0 :(得分:5)
在Chang's answer中,他使用了一个解析器,你需要调整它以匹配日期字符串的日期格式:
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 docs详细介绍了很多细节。