1

我正在尝试将 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 中?

4

1 回答 1

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类型的列,这可能不是您想要的。

引用那里的文档示例:

>>> 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
于 2016-01-26T20:15:12.863 回答