更新:这是“usecols with parse_dates and names”的副本,但首先回答了这个问题。
我无法让这段代码适合我的生活。我一拿出names
参数就可以正常工作,但那真是太傻了。
从我想要的空格分隔文件:
这几乎有效:
import panadas as pd
columns = [4, 5, 10, 11, 15, 16, 17, 26, 28, 29]
names = ["DATE","TIME","DLAT", "DLON", "SLAT", "SLON", "SHGT", "HGT", "N", "E"]
ppp_data = pd.read_table(
filename,
delim_whitespace=True, # space delimited
skiprows=8, # skip header rows
header=None, # don't use first row as column names
usecols=columns, # only use selected columns
names=names, # use names for selected columns
parse_dates=[[4,5]], # join date and time columns and parse as date
index_col=0, # use parsed date (now column 0) as index
)
print ppp_data
但这是我正在获得的堆栈跟踪
Traceback (most recent call last):
File "plot_squat_test_pandas.py", line 30, in <module>
index_col=0,
File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 400, in parser_f
return _read(filepath_or_buffer, kwds)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 205, in _read
return parser.read()
File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 608, in read
ret = self._engine.read(nrows)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 1028, in read
data = self._reader.read(nrows)
File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandas/parser.c:6745)
File "parser.pyx", line 728, in pandas.parser.TextReader._read_low_memory (pandas/parser.c:6964)
File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows (pandas/parser.c:7780)
File "parser.pyx", line 865, in pandas.parser.TextReader._convert_column_data (pandas/parser.c:8512)
File "parser.pyx", line 1105, in pandas.parser.TextReader._get_column_name (pandas/parser.c:11684)
IndexError: list index out of range
如果我注释掉names=names
参数并且工作正常
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 86281 entries, 2013-10-30 00:00:00 to 2013-10-30 23:59:59
Data columns (total 8 columns):
10 86281 non-null values
11 86281 non-null values
15 86281 non-null values
16 86281 non-null values
17 86281 non-null values
26 86281 non-null values
28 86281 non-null values
29 86281 non-null values
我错过了什么?或者这是panadas的一个问题,我应该去做一个错误报告吗?
我正在使用python 2.7.3,并且使用pandas,上面的堆栈跟踪来自稳定版本0.12.0。我已经尝试使用开发版本0.13.0rc1-119-g2485e09并得到了相同的结果(不同的行号)。
答案 0 :(得分:3)
这是pandas版本中的bug,包括当前开发版本0.13.0rc1-119-g2485e09。有两种解决方法。
在usecols
和names
中包含表格的最后一列将取消IndexError
from StringIO import StringIO
import pandas as pd
data = """2013-10-11 11:53:49,1,2,3,4
2013-10-11 11:53:50,1,2,3,4
2013-10-11 11:53:51,1,2,3,4"""
df = pd.read_csv(
StringIO(data),
header=None,
usecols=[0,2,4],
names=["DATE","COl2","COL4"],
parse_dates=["DATE"],
index_col=0,
)
print df
另外,您可以在事后rename列,如this question
ppp_data.rename(columns=dict(zip(columns[2:],names)), inplace=True)
答案 1 :(得分:1)
names
有10个元素:
In [1]: len(["DATE","TIME","DLAT", "DLON", "SLAT", "SLON", "SHGT", "HGT", "N", "E"])
Out[1]: 10
但是当你省略names
参数时,read_table
只解析了8列:
Data columns (total 8 columns):
因此,如果所需的DataFrame有8列且只有一个索引,那么names
可能有9个(或8个)元素。
请注意
parse_dates=[[4,5]],
将第4列和第5列合并为一列。因此,即使原始数据有10列,剩下的仍然是8列和索引。如果使names
有9个元素,则第一个元素用于命名索引。