为ASCII d添加名称和指定数据类型

2024-09-27 21:31:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我的教授使用IDL并给我发送了一个ASCII数据文件,我最终需要能够读取和操作这些数据。在

他使用以下命令读取数据:

readcol, 'sn-full.txt', format='A,X,X,X,X,X,F,A,F,A,X,X,X,X,X,X,X,X,X,A,X,X,X,X,A,X,X,X,X,F,X,I,X,F,F,X,X,F,X,F,F,F,F,F,F', $
sn, off1, dir1, off2, dir2, type, gal, dist, htype, d1, d2, pa, ai, b, berr, b0, k, kerr

下面是前两行的图片:http://i.imgur.com/hT7YIE3.png

因为我不打算成为一名天文学家,我正在使用Python,但由于我对它还不熟悉,所以我很难读懂数据。在

我知道his代码将数据类型A(字符串数据)分配给列1,使用X跳过第2-6列,然后将数据类型F(浮点)分配给第7列,等等,然后将sn分配给第一列,等等

我试图通过使用numpy.loadtxt("sn-full.txt")ascii.read("sn-full.txt")来复制这一点,但不确定如何输入dtype参数。我知道我可以将所有的数据类型都指定为特定的数据类型,但是如何将数据类型分配给各个列呢?在


Tags: 数据命令txtformat数据文件ascii读取数据full
3条回答

使用astropy.io.ascii您应该能够相对容易地读取文件:

from astropy.io import ascii
# Give names for ALL of the columns, as there is no easy way to skip columns
# for a table with no column header.
colnames = ('sn', 'gal_name1', 'gal_name2', 'year', 'month', 'day', ...)
table = ascii.read('sn_full.txt', Reader=ascii.NoHeader, names=colnames)

这将为您提供一个包含所有数据列的表。事实上,您有一些不需要的列不是问题,除非表是大行长的。对于您展示的表,您不需要显式地指定数据类型,因为io.ascii.read将正确地确定它们。在

这里的一个小问题是,您所显示的表实际上是一个固定宽度的表,这意味着所有列都垂直排列。请注意,第一行以1998S NGC 3877开头。只要每一行都有相同的模式,用三个空格分隔的列来表示超新星的名称和星系的名称,就可以了。但是如果任何一个星系名称是一个单词,那么解析将失败。我怀疑如果IDL readcol正在工作,那么相应的io.ascii版本应该可以开箱即用。如果不是,那么io.ascii有一种读取固定宽度表的方法,在表中显式地提供列名和位置。在

[编辑] 在本例中,似乎需要一个固定宽度的读取器来通知解析器如何拆分列,而不是仅仅使用空格作为分隔符。因此,基本上需要在表文件的顶部添加两行,第一行给出列名,第二行用破折号表示每列的跨度:

^{pr2}$

astropy.io.ascii中,如果不能修改输入数据文件,也可以通过代码指定每列的开始和停止位置,例如:

>>> ascii.read(table, Reader=ascii.FixedWidthNoHeader,
               names=('Name', 'Phone', 'TCP'),
               col_starts=(0, 9, 18),
               col_ends=(5, 17, 28),
              )

我将使用Pandas来实现这个特殊目的。最简单的方法是,假设列是单制表符分隔的:

import pandas as pd
import scipy as sp   # Provides all functionality from numpy, too
mydata = pd.read_table(
             'filename.dat', sep='\t', header=None, 
             names=['sn', 'gal_name1', 'gal_name2', 'year', 'month',...],
             dtype={'sn':sp.float64, 'gal_name1':object, 'year':sp.int64, ...},)

(这里的字符串属于常规的“object”数据类型)。在

现在每个列都有一个名称,可以作为mydata['colname']进行访问,然后可以像常规numpy1d数组一样对其进行切片,比如mydata['colname'][20:50]

Pandas内置了对matplotlib的plotting调用,因此您可以通过mydata['column'].plot()快速获得一个数值类型列的概述,或者以mydata.plot('col1', 'col2')的形式对两个不同的列进行比较。可以传递所有正常的绘图关键字。在

如果要在普通matplotlib例程中打印数据,只需将列传递到matplotlib,在那里它们将被视为普通Numpy向量。 每个列都可以作为一个普通的Numpy向量作为mydata['colname'].values来访问。在

编辑

如果您的数据不是一致分离的,numpy的genfromtxt()函数更好。然后可以通过

^{pr2}$

http://casa.colorado.edu/~ginsbura/pyreadcol.htm看起来像你想要的那样。它模拟IDL的readcol函数。在

另一种可能是https://pypi.python.org/pypi/fortranformat。看起来它的功能可能更强大,您所查看的数据是固定格式的,而格式说明符(X、A等)是fortran格式说明符。在

相关问题 更多 >

    热门问题