1. 什么是fits文件?

fits全称为Flexible Image Transport System,它是一种用于世界各地天文台之间数据传输、数据交换的一数据处理种数据格式。它描述了数据的定义和数据编码的一般方法,fits文件的缀名为数据处理是将什么转换成什么.fits

2. fits数据处理的最小单位文件的格式

一个fits文件包含多个HDU(primary header and data unit 基本头单元与数据单元),如下图,每数据处理英文一行都是一个HDU。

天文数据的利器-Fits文件

每个HDU都是有header和data数据处理的基本单位两部分组成。

  • head数据处理是将什么转换成什么er: 存储着对data中整体的描述信息和对每一列数据的描述信息(如TTYPE表示列名;TFO数据处理的基本单位RM表数据处理英文示列中数据类型,每一个字母都代表一种数据类型)。

天文数据的利器-Fits文件

  • data: 存数据处理的最小单位储着数据,可以是一维的、二维的等等。如下图,data中的数据是一个二维的数据,存放着发射线强度等信息。

天文数据的利器-Fits文件

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文件的名称

  • 第二行:下面数据的标题

    1. No.:表示第几个hdu
    2. name: 当前hdu的名称
    3. Dimensions:当前hdu中data的数据维度,即行x列
    4. 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() 

天文数据的利器-Fits文件

通过.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']