1. 什么是fits文件?
fits
全称为Flexible Image Transport System,它是一种用于世界各地天文台之间数据传输、数据交换的一数据处理种数据格式。它描述了数据的定义和数据编码的一般方法,fits文件的缀名为数据处理是将什么转换成什么.fits
。
2. fits数据处理的最小单位文件的格式
一个fits文件包含多个HDU(primary header and data unit 基本头单元与数据单元),如下图,每数据处理英文一行都是一个HDU。
每个HDU都是有header和data数据处理的基本单位两部分组成。
- head数据处理是将什么转换成什么er: 存储着对data中整体的描述信息和对每一列数据的描述信息(如TTYPE表示列名;TFO数据处理的基本单位RM表数据处理英文示列中数据类型,每一个字母都代表一种数据类型)。
- data: 存数据处理的最小单位储着数据,可以是一维的、二维的等等。如下图,data中的数据是一个二维的数据,存放着发射线强度等信息。
3. fits文件的读取
我们使用`astropy
提供的fits文件操作工具来进行fits文件的读取。首先要导入fits文件:
from astropy.io import fits
3.1 fits文件的读取及基本信息
通过fits.open(path)
函数读取fits文件,获得含有多个HDU数据处理是将什么转换成什么的list对象,通过下标的方式我们可以获取指定的hdu。
hdu_list = fits.open("./fits_data/spec-0266-51602-0012.fits")
当读取完毕后一定要使用hdu_list.close()
方法关闭文件流,否则会占用大量的内存。
使用函数数据处理的目的hdu_list.info(数据处理的最小单位)
方法,我们可以查看当前fit数据处理的基本单位s文件的一些基本信息数据处理的概念:
"""fits文件的读取及查看基本信息"""
def demo01():
hdu_list = fits.open("./fits_data/spec-0266-51602-0012.fits")
print("fits文件基本信息:")
hdu_list.info()
hdu_list.close()
输出:
fits文件基本信息:
Filename: ./fits_data/spec-0266-51602-0012.fits
No. Name Ver Type Cards Dimensions Format
0 PRIMARY 1 PrimaryHDU 122 ()
1 COADD 1 BinTableHDU 26 3837R x 8C [E, E, E, J, J, E, E, E]
2 SPECOBJ 1 BinTableHDU 262 1R x 126C [6A, 4A, 16A, 23,……,5E]
3 SPZLINE 1 BinTableHDU 48 29R x 19C [J, J, J, 13,……, J, E, E]
-
第一行
filename
: 表示当前读取fits文件的名称 -
第二行:下面数据的标题
-
No.
:表示第几个hdu -
name
: 当前hdu的名称 -
Dimensions
:当前hdu中data的数据维度,即行x列 -
format
:数据类型,I表示整型, J表示长整形, E表示浮点型, D表示双精度浮点型,A表示字符型
-
3.2 fits文件的数据操作
通过下标的方式我们从hdu list数据处理方法对象中获取一个hdu对象。通过hdu.header
我们数据处理的概念可以查看当前hdu的头文件
"""查看hdu的头文件"""
def demo02():
hdu_list = fits.open("./fits_data/spec-0266-51602-0012.fits")
hdu = hdu_list[1]
hdu_header = hdu.header
print(hdu_header)
hdu_list.close()
通过.data
的方式我们可以获得hdu的数据部分。返回值是类型是fits文件中特有的类型。
但我们按列获取后得到的是numpy数据处理方法.ndarray
类型的数据对象。这时,数据处理的概念我们就可以通过numpy和pandas来进行数据处理。
"""获取hdu数据部分"""
def demo03():
hdu_list = fits.open("./fits_data/spec-0266-51602-0012.fits")
hdu = hdu_list[1]
data = hdu.data
print("hud data部分的数据类型为:",type(data))
print(data)
flux = hdu.data["flux"] # 等价于 hdu.data.field(‘flux’)
print("n hud data部分中 每一列 的数据类型为:",type(flux))
print(flux)
hdu_list.close()
输出:
hud data部分的数据类型为: <class 'astropy.io.fits.fitsrec.FITS_rec'>
[( 8.7938795, 3.5803, 0.05449915, 0, 0, 1.2542306, 6.6273575, 6.400915 )
(15.133193 , 3.5804, 0.04994194, 0, 0, 1.2539674, 6.350275 , 6.7443757)
...
(16.940786 , 3.9639, 0.42537764, 16, 16, 0.7964833, 4.486557 , 12.947592 )]
hud data部分的数据类型为: <class 'numpy.ndarray'>
[ 8.7938795 15.133193 10.525017 ... 12.286306 16.704823 16.940786 ]
除此之外,我们可以通过hdu.data.na数据处理是将什么转换成什么mes
来查看所有的data部分的列名
"""查看hdu data 部分的列名"""
def demo04():
hdu_list = fits.open("./fits_data/spec-0266-51602-0012.fits")
hdu = hdu_list[1]
names = hdu.data.names
print("hud data部分的列名为:")
print(names)
hdu_list.close()
输出:
hud data部分的列名为:
['flux', 'loglam', 'ivar', 'and_mask', 'or_mask', 'wdisp', 'sky', 'model']