我试图在ascii表中读入Python中的Numpy / Pandas / Astropy数组/数据帧/表。表中的每一行都如下所示:
329444.6949 0.0124 -6.0124 3 97.9459 15 32507 303 7 3 4 8 2 7 HDC-13-O
问题是列之间没有明确的分隔符/分隔符,因此对于某些行,两列之间没有空格,如下所示:
332174.9289 0.0995 -6.3039 3 1708.1601219 30501 30336 333 37 136 H2CO
从网页上可以看出这些被称为"卡片图像"。表格格式的信息描述如下:
目录数据文件由80个字符的卡片图像组成 每个谱线一张卡片图像。每张卡片图片的格式为: FREQ,ERR,LGINT,DR,ELO,GUP,TAG,QNFMT,QN',QN" (F13.4,F8.4, F8.4,I2,F10.4,I3,I7,I4,6I2,6I2)
我真的想要一种方法,我只使用上面给出的格式说明符。我发现的唯一一件事是Numpy的genfromtxt功能。但是,以下情况不起作用。
np.genfromtxt('tablename', dtype='f13.4,f8.4,f8.4,i2,f10.4,i3,i7,i4,6i2,6i2')
任何人都知道如何使用给定的每列的格式规范将此表读入Python?
答案 0 :(得分:3)
您可以在Astropy中使用固定宽度的阅读器。见:http://astropy.readthedocs.org/en/latest/io/ascii/fixed_width_gallery.html#fixedwidthnoheader。这仍然需要您对列进行计数,但您可能可以为您显示的dtype
表达式编写一个简单的解析器。
与上面的pandas解决方案(例如df['FREQ'] = df.data.str[0:13]
)不同,这将自动确定列类型并为您的案例提供float和int列。 pandas版本会生成所有str
类型的列,这可能不是您想要的。
引用那里的doc示例:
>>> from astropy.io import ascii
>>> table = """
... #1 9 19 <== Column start indexes
... #| | | <== Column start positions
... #<------><--------><-------------> <== Inferred column positions
... John 555- 1234 192.168.1.10
... Mary 555- 2134 192.168.1.123
... Bob 555- 4527 192.168.1.9
... Bill 555-9875 192.255.255.255
... """
>>> ascii.read(table,
... format='fixed_width_no_header',
... names=('Name', 'Phone', 'TCP'),
... col_starts=(1, 9, 19),
... )
<Table length=4>
Name Phone TCP
str4 str9 str15
---- --------- ---------------
John 555- 1234 192.168.1.10
Mary 555- 2134 192.168.1.123
Bob 555- 4527 192.168.1.9
Bill 555-9875 192.255.255.255