表格数据#

QTableTable 类包括两种方法, read()write() ,这使得可以读取和写入文件。支持多种格式(请参阅 Built-in table readers/writers )并且可以在 Table 类(请参阅 I/O Registry ).

要使用此接口,请首先导入 Table 同学们,然后打电话给 Table read() 方法,例如文件名和文件格式 'ascii.daophot'

>>> from astropy.table import Table
>>> t = Table.read('photometry.dat', format='ascii.daophot')

可以使用URL直接从互联网加载表。例如,从CDS格式的Vizier目录下载表格 ('ascii.cds' ):

>>> from astropy.table import Table
>>> t = Table.read("ftp://cdsarc.unistra.fr/pub/cats/VII/253/snrs.dat",
...         readme="ftp://cdsarc.unistra.fr/pub/cats/VII/253/ReadMe",
...         format="ascii.cds")

对于某些文件格式,可以自动检测格式,例如,从文件扩展名:

>>> t = Table.read('table.tex')

对于写入表,可以显式指定格式:

>>> t.write(filename, format='latex')

至于 read() 方法,在某些情况下可能会自动识别格式。

底层文件处理程序还将自动检测各种压缩数据格式,并在Python安装支持的范围内解压缩它们(请参阅 get_readable_fileobj() ).

对于编写,还可以指定有关 Table serialization methods 通过 serialize_method 关键字参数。这允许精确控制写出某些列的方式,例如将ISO格式的时间列作为一对JD1/JD2浮点值(用于完全解析)或格式化的ISO日期字符串。

内置表读写器#

Table 类内置支持各种输入和输出格式,包括 astropy.io.ascii , FITS , HDF5 , Pandas , 镶木地板 ,而且 VO表 .

支持的格式和相应的类的完整列表如下表所示。这个 Write 列指示那些支持写入功能的格式,以及 Suffix 列指示指示特定格式的文件名后缀。如果 Suffixauto ,则从文件本身自动检测格式。并非所有格式都支持自动检测。

格式

后缀

描述

ASCII码

是的

大多数支持格式的文本表(使用猜测)

ascii.aastex

是的

AASTex :用于AAS期刊的AASTeX deluxetable

ascii.basic

是的

Basic :带自定义分隔符的基本表

ascii.cds

Cds :CDS格式表

ascii.commented_header

是的

CommentedHeader :注释行中的列名

ascii.csv

是的

.csv文件

Csv :带有逗号分隔值的基本表

ascii.daophot

Daophot :IRAF DAOphot格式表

ascii.ecsv

是的

.ecsv系统

Ecsv :具有增强CSV的基本表(支持元数据)

ascii.fixed_width

是的

FixedWidth :固定宽度

ascii.fixed_width_no_header

是的

FixedWidthNoHeader :固定宽度,无标题

ascii.fixed_width_two_line

是的

FixedWidthTwoLine :具有第二条标题行的固定宽度

ascii.html

是的

.html格式

HTML :HTML表格

ascii.ipac

是的

Ipac :IPAC格式表

ascii.latex

是的

.tex公司

Latex : Latex 表

ascii.mrt

是的

Mrt :AAS机器可读表格格式

ascii.no_header

是的

NoHeader :没有标题的基本表

ascii.qdp

是的

.qdp

QDP :Quick和Dandy绘图仪文件

ascii.rdb

是的

.rdb文件

Rdb :用类型定义标题行分隔的选项卡

ascii.rst

是的

.重新设置

RST :restructedText简单格式表

ascii.sextractor

SExtractor :SExtractor格式表

ascii.tab

是的

Tab :带制表符分隔值的基本表

ascii.tdat

是的

.tdat

Tdat :可移植数据库聚合表格式

适合

是的

汽车

fits :灵活的图像传输系统文件

hdf5型

是的

汽车

HDF5 :分层数据格式二进制文件

jsviewer

是的

JavaScript查看器格式(只写)

pandas.csv

是的

pandas.read_csv()pandas.DataFrame.to_csv()

pandas.fwf

pandas.read_fwf() (固定宽度格式)

pandas.html

是的

pandas.read_html()pandas.DataFrame.to_html()

pandas.json

是的

pandas.read_json()pandas.DataFrame.to_json()

镶木地板

是的

汽车

Parquet :Apache Parquet二进制文件

parquet.votable

是的

带有VOmetals表的拼花文件

pyarrow.csv

read_csv() :高性能CSV阅读器

可听的

是的

汽车

votable :虚拟天文台(VO)计划使用的表格格式

votable.parquet

是的

VOTables的拼花系列化。指定此格式进行写入,读取是自动的。

细节#

表序列化方法#

astropy 支持对写出(序列化)表中列的方式进行细粒度控制。例如,如果您要将ISO格式的时间列写入ECSV文本表文件,则您可能希望将其写入一对JD 1/JD 2浮点值以实现全分辨率(完美的“往返”),或者作为格式化的ISO日期字符串,以便您的其他应用程序可以轻松阅读这些值。

序列化的默认方法取决于格式(FITS、ECSV、HDF 5)。例如,HDF 5是一种二进制格式,因此将Time对象存储为JD 1/JD 2是有意义的,而ECSV是一种平面文本格式,通常您希望以与Time对象相同的格式查看日期。默认值还反映了试图最大限度地减少之间的兼容性问题 astropy 版本.例如,在能够作为JD 1/JD 2对写入之前的版本中,可以将时间列作为格式化字符串写入ECSV,因此ECSV的当前默认值是作为格式化字符串写入。

具有可配置序列化方法的两个类是 TimeMaskedColumn .每种格式的默认值如下:

格式

时间

MaskedColumn

FITS

jd1_jd2

null_value

ECSV

formatted_value

null_value

HDF5

jd1_jd2

data_mask

YAML

jd2_jd2

---

实例#

首先创建一个具有时间列和屏蔽列的表::

>>> import sys
>>> from astropy.time import Time
>>> from astropy.table import Table, MaskedColumn

>>> t = Table(masked=True)
>>> t['tm'] = Time(['2000-01-01', '2000-01-02'])
>>> t['mc1'] = MaskedColumn([1.0, 2.0], mask=[True, False])
>>> t['mc2'] = MaskedColumn([3.0, 4.0], mask=[False, True])
>>> t
<Table masked=True length=2>
           tm             mc1     mc2
          Time          float64 float64
----------------------- ------- -------
2000-01-01 00:00:00.000      --     3.0
2000-01-02 00:00:00.000     2.0      --

现在指定您想要所有 Time 写为JD 1/JD 2的列和 mc1 列作为数据/掩码对写入ECSV::

>>> serialize_method = {Time: 'jd1_jd2', 'mc1': 'data_mask'}
>>> t.write(sys.stdout, format='ascii.ecsv', serialize_method=serialize_method)
# %ECSV 1.0
 ...
# schema: astropy-2.0
 tm.jd1    tm.jd2  mc1  mc1.mask  mc2
2451544.0    0.5   1.0   True     3.0
2451546.0   -0.5   2.0   False     ""

(为清楚起见,增加了空格)

请注意, tm 列已替换为 tm.jd1tm.jd2 列,同样也是一个新列 mc1.mask 已出现,并且它显式包含掩码值。当使用 ascii.ecsv 读取器,则重建原始列。

这个 serialize_method 参数可以用两种不同的方式设置:

  • 就像一根弦 data_mask . 然后,该值将应用于每一列,对于没有时间列的屏蔽表来说,这是一种方便的策略。

  • 作为一个 dict ,其中键可以是单个列名或类(如上面的示例所示),值是相应的序列化方法。

读取和写入列对象#

各个表列没有自己的读写功能,但很容易从表中仅选择一列(此处为“obetime”)进行写入:

>>> from astropy.time import Time
>>> tab = Table({'name': ['AB Aur', 'SU Aur'],
...              'obstime': Time(['2013-05-23T14:23:12', '2011-11-11T11:11:11'])})
>>> tab[['obstime']].write('obstime.fits')

注意符号 [['obstime']] 在最后一行中,用字符串列表对表进行索引,为我们提供了一个新表,其中包含字符串给出的列。由于内部列表只有一个元素,因此结果表只有一列。

然后,我们可以读回该单列表并从中提取列::

>>> col = Table.read('obstime.fits').columns[0]
>>> type(col)
<class 'astropy.table.column.Column'>

关于文件名的注释#

这两个 read()write() 方法可以接受以下形式的文件路径 ~/data/file.csv~username/data/file.csv 。这些以代字号为前缀的路径的展开方式与许多命令行实用程序相同,分别表示当前用户或指定用户的主目录。

命令行实用程序#

备注

在v7.1中, showtable 为了避免Debian上的名称冲突,现在不建议使用命令;使用 showtable-astropy 而不是.在将来的版本中将删除不推荐使用的命令。

为了方便起见,命令行工具 showtable-astropy 可用于打印统一I/O接口支持的格式的表格内容。

例子#

要在命令行上查看表的内容,请执行以下操作:

$ showtable-astropy astropy/io/fits/tests/data/table.fits

 target V_mag
------- -----
NGC1001  11.1
NGC1002  12.3
NGC1003  15.2

要获取有关使用和可用选项的完整文档,请执行 showtable-astropy --help .